語言分割偽彩色掩碼詳解

wancy發表於2024-05-25
1.偽彩色圖

  偽彩色(pseudo-color)影像是一種影像處理技術,用於將灰度影像或單通道影像對映到彩色空間,以便透過顏色差異來增強影像的視覺表現。在偽彩色影像中,不同的灰度級或資料值被賦予不同的顏色,從而建立出一個彩色的影像表示。偽彩色圖每個畫素值實際上是一個索引值或程式碼,該程式碼值作為色彩查詢表CLUT(Color Look-Up Table)中某一項的入口地址,根據該地址可查詢出包含實際R、G、B的強度值。這種用查詢對映的方法產生的色彩稱為偽彩色,生成的影像為偽彩色影像。偽彩色圖查詢表是一個預先定義好的對映表,它將原始影像的灰度值(或某個特定範圍內的灰度值)對映到特定的顏色值。每個條目通常包含紅、綠、藍(RGB)三個顏色通道的值,以及可能的透明度(Alpha)資訊。

  需要注意的是,偽彩色影像並不是真正的彩色影像,而是透過對灰度影像或單通道影像進行顏色對映得到的。因此,在解釋偽彩色影像時,需要注意顏色所代表的實際含義。

2. 影像模式

  影像模式是指影像中畫素的儲存和表示方式,不同的模式對應不同的顏色深度和儲存需求。在PIL中,常見的影像模式包括“1”(二值影像)、“L”(灰度影像)、“P”(調色盤影像)、“RGB”(紅綠藍三通道彩色影像)、“RGBA”(紅綠藍及透明度四通道彩色影像)、“CMYK”(印刷色彩模式,包括青、洋紅、黃和黑色)、“YCbCr”(用於JPEG壓縮的顏色空間)、“I”(32位整型影像)和“F”(32位浮點型影像)等。

from PIL import Image
img = Image.open('test.png')
mode = img.mode
print(mode)  # 輸出可能是'L', 'RGB', 'RGBA'等

  如果你輸入的是彩色圖,那麼輸出是RGB。在cv2中沒有直接的輸出影像模式的方法。

3.P模式(Pseudocolor mode)與L模式(Luminance mode)

  上面介紹了影像模式,這裡主要介紹語義分割中用到的標籤的影像的模式。

  1. P模式(Pseudocolor mode):

    • 在P模式下,灰度影像的每個畫素值會被對映到一個特定的顏色上。
    • 對映函式可以是線性的,也可以是非線性的,取決於所選的偽彩色變換方法。
    • 偽彩色圖可以用於突出顯示影像中的特定特徵,如邊緣、紋理或特定型別的影像資料(例如醫學成像中的不同組織型別)。
    • P模式下的偽彩色圖通常用於科學視覺化,其中不同的顏色可以幫助解釋和理解資料。
  2. L模式(Luminance mode):

    • L模式通常指的是亮度模式,它是一種將灰度影像轉換為具有單一顏色通道的影像的方法。
    • 在L模式下,影像的每個畫素值被轉換為相同的顏色(通常是白色或其他單一顏色),然後透過調整亮度來區分不同的畫素值。
    • 這種方法通常用於建立高對比度的影像,使得影像中的不同區域或特徵透過亮度的變化來區分,而不是顏色的變化。
    • L模式下的影像可能不如P模式那樣豐富和多彩,但它們可以提供一種簡單而有效的方式來強調影像中的亮度差異。

  這裡對標籤掩碼灰度圖及偽彩色掩碼圖進行測試(從左至右分別是原圖,labelme得到的標籤偽彩色掩碼圖label.png,單通道灰度圖pic.png):

import cv2
import numpy as np
from PIL import Image
img = Image.open('pic.png')
mode = img.mode
print(mode)  # L
print(np.unique(img))#[0 1 2]
###############################
img = Image.open('label.png')
mode = img.mode
print(img.getpalette())#PIL的P模式預設調色盤RGB顏色及順序[
0, 0, 0, 128, 0, 0, 0, 128, 0, 128, 128, 0, 0, 0, 128, 128, 0, 128, 0, 128, 128, 128, 128,...... print(mode) # P print(np.unique(img))#[0 1 2] #如果下面使用cv2去讀取圖片,結果如下: img=cv2.imread('label.png',0)#以灰度讀取偽彩色標籤圖 print(np.unique(img))#[ 0 38 75] img=cv2.imread('label.png',1)#以彩色讀取偽彩色標籤圖 print(np.unique(img))#[ 0 128] img=cv2.imread('pic.png',0) print(np.unique(img))#[0 1 2] img=cv2.imread('pic.png',1) print(np.unique(img))#[0 1 2]

  上述程式碼中,np.unique是用來測試影像的畫素值有哪些。很顯然cv2對於P模式的偽彩色標籤圖,會以三通道彩色圖去讀取,無法讀取到實際的標籤種類。

4. P模式與L模式相互轉換

  P模式轉L模式

from PIL import Image

# 讀取偽彩色P模式影像
img = Image.open('pseudo_color_image.png')
# 檢查影像模式
print(f"原始影像模式: {img.mode}")
# 如果影像不是RGB模式,先轉換為RGB模式(這裡假設影像已經是P模式)
if img.mode != 'RGB':
    img = img.convert('RGB')
# 將RGB影像轉換為灰度影像
gray_img = img.convert('L')
# 儲存灰度影像
gray_img.save('gray_image.jpg')
# 檢查轉換後的影像模式
print(f"轉換後影像模式: {gray_img.mode}")

  L模式轉P模式

from PIL import Image

# 開啟L模式影像
image = Image.open("pic.png")
# 將L模式轉換為P模式,並設定調色盤
p_image = image.convert("P")  # 這裡的palette引數實際上是被忽略的
#自定義一個包含5種顏色的調色盤
colors = [128, 128, 0,0, 255, 0, 0, 0, 255, 0, 0, 255, 255, 255, 255]
p_image.putpalette(colors)
# 儲存帶有自定義調色盤的P模式影像
p_image.save("converted_palette_image.png")
# 驗證影像模式
print(f"轉換後影像模式: {p_image.mode}")

5.Alpha透明通道與自定義語義分割標籤生成

  後面補充。

小結:JPG(JPEG)格式不支援調色盤

相關文章