偽彩色(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)
上面介紹了影像模式,這裡主要介紹語義分割中用到的標籤的影像的模式。
-
P模式(Pseudocolor mode):
- 在P模式下,灰度影像的每個畫素值會被對映到一個特定的顏色上。
- 對映函式可以是線性的,也可以是非線性的,取決於所選的偽彩色變換方法。
- 偽彩色圖可以用於突出顯示影像中的特定特徵,如邊緣、紋理或特定型別的影像資料(例如醫學成像中的不同組織型別)。
- P模式下的偽彩色圖通常用於科學視覺化,其中不同的顏色可以幫助解釋和理解資料。
-
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)格式不支援調色盤