圖像的基本表示方法
1.二值圖像
二值圖像是指僅包含黑色和白色兩種顏色的圖像

2.1 灰色圖像
灰度圖像有256個灰度級,用數值區間[0,255]來表示,其中255表示為純白色,0表示為純黑色
256個灰度級的數值恰好可以用一個字節(8位二進制值)來表示


由于OpenCV沒有二值圖像這種數據類型,所以我們可以把二值圖像理解為特殊的灰度圖像
為了方便理解,我們首先使用Numpy庫生成一個4×4大小的數組,來模擬黑色圖像來進行處理

(2)

(3)

(4)

3.1 彩色圖像
在RGB色彩空間中,存在R,G,B三個通道,每個通道的數值范圍在[0,255]之間,我們利用這三個色彩通道的組合表示顏色
三種顏色經過混合可以配出常見的256×256×256=16777216種顏色
在OpenCV中,通道的順序是B→G→R

img[0,0]訪問圖像img第0行第0列像素點的BRG值 [B,G,R]
img[0,0,0]訪問img第0行第0列第0通道的像素值,會得到B通道第0行第0列的值
img[0,0,2]訪問img第0行第0列第2通道的像素值,會得到R通道第0行第0列的值
為了方便理解,我們首先使用Numpy生成一個2×4×3大小的數組,用它來模擬一幅彩色圖像并對其進行簡單處理

這時候就發現,展示出來的圖片是紅色而不是藍色!!!
這是因為pylab的imshow是以RGB的方式展示出來的,而不是cv2的BGR

3.2 感興趣區域(ROI)
在圖像處理的中,我們可能會對圖像的某一個特定區域感興趣,該區域被稱為感興趣的區域(ROI)。在設定感興趣的區域ROI后,就可以對該區域進行整體操作

3.3 通道拆分
在RGB圖像中,圖像由R,G,B三個通道構成。需要注意的是,在OpenCV中,通道是按照B,G,R通道順序存儲的(選的圖片可能有問題,效果并不明顯)
1 img = cv2.imread(r'C:\Users\19225\PycharmProjects\test\src\user\static\5.jpg') 2 b = img[:, :, 0] # 獲取藍色通道 3 g = img[:, :, 1] # 獲取綠色通道 4 r = img[:, :, 2] # 獲取紅色通道 5 pylab.subplot(1, 3, 1) # 創建一個 1 行 3 列的子圖,并激活第一個子圖 6 pylab.imshow(b) 7 pylab.subplot(1, 3, 2) 8 pylab.imshow(g) 9 pylab.subplot(1, 3, 3) 10 pylab.imshow(r) 11 pylab.show()
================================按照索引拆分
img = cv2.imread(r'C:\Users\19225\PycharmProjects\test\src\user\static\face.jpg')
b, g, r = cv2.split(img)
pylab.subplot(1, 3, 1)
pylab.imshow(b)
pylab.subplot(1, 3, 2)
pylab.imshow(g)
pylab.subplot(1, 3, 3)
pylab.imshow(r)
pylab.show()
================================================通過函數拆分

3.4 通道合并

3.5 獲取圖像屬性
1 img = cv2.imread(r'C:\Users\19225\PycharmProjects\test\src\user\static\5.jpg') 2 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 3 pylab.imshow(img_gray) 4 # pylab.show() 5 print(f'圖像尺寸:{img_gray.shape}') # 圖像尺寸:(2340, 1080) 6 print(f'圖像數據類型:{img_gray.dtype}') # 圖像數據類型:uint8 7 print(f'圖像大小:{img_gray.size}') # 圖像大小:2527200
四 .圖像運算
4.1 加號運算符
對于+號運算,當對圖像a,圖像b進行加法求和時,遵循以下規則:
當某位置像素相加得到的數值小于255時,該位置數值為兩圖像該位置像素相加之和
當某位置像素相加得到的數值大于255時,該位置數值為兩像素該位置像素相加之和對256取模

示例:
1 lena = cv2.imread(r'C:\Users\19225\PycharmProjects\test\src\user\static\face.jpg') 2 lena_two = lena + lena # 將lena圖像與自身進行逐元素相加。因為每個像素的值范圍在 0 到 255 之間,這個加法可能導致某些像素值超過 255。 3 lena = cv2.cvtColor(lena_two, cv2.COLOR_BGR2RGB) # 函數將lena_two從 BGR 顏色空間轉換為 RGB 顏色空間 4 pylab.imshow(lena_two) 5 pylab.show()

4.2 CV2.add()函數
其實和加法差不多
對于cv2.add()運算,當對圖像a,圖像b進行加法求和時,遵循以下規則:
當某位置像素相加得到的數值小于255時,該位置數值為兩圖像該位置像素相加之和
當某位置像素相加得到的數值大于255時,該位置數值為255
1 img1 = np.array([[200, 100, 200], [100, 200, 100], [0, 200, 50]], dtype=np.uint8) 2 img2 = np.array([[200, 100, 200], [100, 200, 100], [0, 200, 50]], dtype=np.uint8) 3 print("img1=", img1) 4 print("img2=", img2) 5 print("cv2.add(img1,img2)=") 6 print(cv2.add(img1, img2)) # 可以發現相加大于255的位置對256取模
4.3 圖像加權運算
所謂圖像加權和,就是在計算兩幅圖像的像素值之和時,將每幅圖像的權重考慮進來,可以用公式表示為dst=saturate(src1×α+src×β+γ)
示例
1 img = cv2.imread(r'C:\Users\19225\PycharmProjects\test\src\user\static\3.jpg') 2 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 3 lena = cv2.imread(r'C:\Users\19225\PycharmProjects\test\src\user\static\face.jpg') 4 lena = cv2.cvtColor(lena, cv2.COLOR_BGR2RGB) 5 6 # 提取并調整大小 7 img_to = cv2.resize(img[100:300, 100:300], (100, 100)) # 調整為 100x100 尺寸 8 lena_to = lena[50:150, 50:150] 9 10 # 加權相加 11 result = cv2.addWeighted(img_to, 0.5, lena_to, 0.5, 0) 12 13 # 將結果賦值到 lena_to 的特定區域 14 lena_to[0:100, 0:100] = result # 調整賦值區域為 (0:100, 0:100) 15 16 pylab.imshow(lena_to) 17 cv2.imwrite(r'C:\Users\19225\PycharmProjects\test\src\user\static\result.jpg', lena_to) 18 pylab.show()

五、色彩空間轉換
顏色空間按照基本結構可以分兩大類:基色顏色空間 和 色、亮分離顏色空間。 前者的典型是 RGB,還包括 CMY、CMYK、CIE XYZ 等;后者包括 YCC/YUV、Lab、以及一批“色相類顏色空間”。 CIE XYZ 是定義一切顏色空間的基準,很奇妙的是,它即屬于基色顏色空間,也屬于色、亮分離顏色空間,是貫穿兩者的樞紐。
色、亮分離顏色空間中的子類型“色相類顏色空間”,是把顏色分成一個表亮屬性,和兩個表色屬性,其中有一個表色屬性是色相,
而色相以外的兩個屬性可以選用不同的變量來定義,而色相的概念不變,因此就構成一族共同使用色相屬性,
另加表亮屬性和表色屬性各一個組成的顏色空間,它們是顏色空間中的一個家族,暫且統稱為 HSB 顏色空間。
RGB和CMY顏色模型都是面向硬件的,而HSV(HueSaturation Value)顏色模型是面向用戶的。 補充: 色光三原色 RGB:吸收倆種,反射自身顏色;在屏幕上顯示的圖像,就是RGB模式表現的 色料三原色CMY:反射兩種,吸收一種顏色;在印刷品上看到的圖像,就是CMYK模式表現的
RGB


顏色范圍
R(Red:紅)、G(Green:綠)、B(Blue:藍) A(Alpha 透明度)
RGB的每個元素在計算機內存中占用1個字節,1個字節等于8個bit位,所以RGB每個元素的取值范圍為:0~256(2的8次方)
存儲類型
(1)RGB555:16位的RGB格式,各分量都用5位表示,剩下的一位不用。
高字節 -> 低字節(根據內存大小端) XRRRRRGGGGGBBBBB(X代表不用)
(2)RGB565:16位的RGB格式,但是R占用5位,G占用6位,B占用5位。
(3)RGB24:24位的RGB格式,各分量占用8位,取值范圍為0-255。
(4)RGB32:32位的RGB格式,各分量占用8位,剩下的8位作Alpha通道或者不用。
(5)RGB222:8位的RGB格式,各分量占用2bit位,剩下的2bit位不用!
。。。。。。。。。。。。。。。。。
單通道與多通道
單通道:俗稱灰度圖,每個像素點只能有一個值表示顏色,它的像素值在0到255之間,0是黑色,255是白色,中間值是一些不同等級的灰色,可以說灰度是黑與白之間的過渡色!
多通道:RGB三原色,每個像素點有三個字節來表示(RGB),分別最大取值范圍是0-255,可以組合成千萬種顏色。

HSV(Hue, Saturation, Value)是根據顏色的直觀特性由A.R. Smith在1978年創建的一種顏色空間, 也稱六角錐體模型(Hexcone Model),HSV模型的三維表示從RGB立方體演化而來。設想從RGB沿立方體對角線的白色頂點向黑色頂點觀察,就可以看到立方體的六邊形外形。六邊形邊界表示色彩,水平軸表示純度,明度沿垂直軸測量。與RGB系統相比,更加接近于人們的經驗和描述彩色感覺是所用的方式。也稱HSB (B指brightness) 是藝術家們常用的。
HSV模型對應于畫家配色的方法。畫家用改變色濃和 色深的方法從某種純色獲得不同色調的顏色,在一種純色中加入白色以改變色濃,加入黑色以改變色深,同時加入不同比例的白色,黑色即可獲得各種不同的色調。
色調H(Hue):用角度度量,取值范圍為0°~360°,從紅色開始按逆時針方向計算,紅色為0°,綠色為120°,藍色為240°。
飽和度S(Saturation):取值范圍為0.0~1.0,值越大,顏色越飽和。用距V軸的距離來度量
明度V(Value):取值范圍為0(黑色)~1(白色)。軸V=0端為黑色,軸V=1端為白色。
CMYK/CMYK彩色空間
CMY模式是指采用青色(Cyan)、品紅色(Magenta)、黃色(Yellow)3種基本顏色按一定比例合成顏色的方法,是一種依靠反光顯色的色彩模式。在CMY模型中,顯示的色彩不是直接來自于光線的色彩,而是光線被物體吸收掉一部分之后反射回來的剩余光線所產生的。因此,光線都被吸收時顯示為黑色(減色法),當光線完全被反射時顯示為白色(加色法)。
從理論上來說,只需要CMY三種油墨等比例混合在一起就會得到黑色,但是因為目前制造工藝水平的限制,制造出來的油墨純度都不夠高,CMY相加的結果實際只是一種暗紅色。所以往往還會加入黑色(black)油墨,這就是CMYK色彩混合模式的由來。CMYK又稱為印刷色彩模式。
RGB模式是一種發光的色彩模式。比如在一間黑暗的房間里,你可以看到投射在墻壁上的光斑;CMY(K)是一種依靠反光的色彩模式。在黑暗房間里你是無法閱讀報紙的,我們之所以能夠看到報紙上的內容是因為有光照射到報紙上,再反射到我們的眼中。
C=255-R C - Cyan 青 〈互補色〉 R - Red 紅
M=255-G M - Magenta 品紅 〈互補色〉 G - Green 綠
Y=255-B Y - Yellow 黃 〈互補色〉 B - Blue 藍
該方程證明了從一個涂滿純凈青色顏料的表面反射回的光不包含紅色。 
YCbCr/YUV彩色空間


YUV(亦稱YCrCb)彩色空間廣泛用于數字視頻。在這種格式中,亮度信息用單獨的分量Y來表示,彩色信息是用兩個色差分量Cb和Cr來存儲的。分量Cb是藍色分量與參考值的差,分量Cr是紅色分量與參考值的差。 亮度信號Y和兩個色差信號R-Y(即U)、B-Y(即V)
YUV主要用于優化彩色視頻信號的傳輸,使其向后相容老式黑白電視。與RGB視頻信號傳輸相比,它最大的優點在于只需占用極少的頻寬(RGB要求三個獨立的視頻信號同時傳輸)。
其中“Y”表示明亮度(Luminance或Luma),也就是灰階值;而“U”和“V”表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用于指定像素的顏色。“亮度”是透過RGB輸入信號來建立的,方法是將RGB信號的特定部分疊加到一起。“色度”則定義了顏色的兩個方面─色調與飽和度,分別用Cr和CB來表示。其中,Cr反映了GB輸入信號紅色部分與RGB信號亮度值之間的差異。而CB反映的是RGB輸入信號藍色部分與RGB信號亮度值之同的差異。 采用YUV色彩空間的重要性是它的亮度信號Y和色度信號U、V是分離的。如果只有Y信號分量而沒有U、V分量,那么這樣表示的圖像就是黑白灰度圖像。彩色電視采用YUV空間正是為了用亮度信號Y解決彩色電視機與黑白電視機的兼容問題,使黑白電視機也能接收彩色電視信號。
5.1 獲得特定顏色
在HSV色彩空間中,H通道(飽和度Hue通道)對應不同的顏色。或者換個角度理解,顏色的差異主要體現在H通道值的不同上。所以,通過對H通道值進行篩選,便能夠篩選出特定的顏色。例如,在一幅HSV凸顯中,如果通過控制僅僅將H通道內值為240(在OPenCV內被調整為120)的像素顯示出來,那么圖像中就會僅僅顯示藍色的部分。
需要注意的是,在實際提取顏色時,往往不是提取一個特定的值,而是提取一個顏色區間。
紅色:值分布范圍為[110,100,100]和[130,255,255]之間
綠色:值分布范圍為[50,100,100]和[70,255,255]之間
藍色:值分布范圍為[0,100,100]和[10,255,255]之間
下面分離特定顏色
1 img = cv2.imread(r'C:\Users\19225\PycharmProjects\test\src\user\static\opencv.png') # 讀取圖片 2 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 獲得hsv色彩空間圖片 3 opencv = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 將bgr轉換成rgb,方便后續pylab展示 4 maxRed = np.array([10, 255, 255]) # 定義紅色范圍的最大值 5 minRed = np.array([0, 100, 100]) # 定義紅色范圍的最小值 6 mask = cv2.inRange(hsv, minRed, maxRed) # 獲得紅色的掩碼 7 res = cv2.bitwise_and(img, img, mask=mask) # 獲得紅色的圖片 8 pylab.imshow(res) 9 pylab.show() # 顯示圖片


5.2 Alpha通道
一、Alpha通道的概念與功能
在計算機圖形學中,一個RGB顏色模型的真彩圖形,用由紅、綠、藍三個色彩信息通道合成的,每個通道用了8位色彩深度,共計24位,包含了所有彩色信息。為實現圖形的透明效果,采取在圖形文件的處理與存儲中附加上另一個8位信息的方法,這個附加的代表圖形中各個素點透明度的通道信息就被叫做Alpha通道。
Alpha通道使用8位二進制數,就可以表示256級灰度,即256級的透明度。白色(值為255)的Alpha像素用以定義不透明的彩色像素,而黑色(值為0)的Alpha通道像素用以定義透明像素,介于黑白之間的灰度(值為30-255)的Alpha像素用以定義不同程度的半透明像素。因而通過一個32位總線的圖形卡來顯示帶Alpha通道的圖形,就可能呈現出透明或半透明的視覺效果。
1 lena = cv2.imread(r'C:\Users\19225\PycharmProjects\test\src\user\static\3.jpg') # 讀取圖片 2 img = cv2.cvtColor(lena, cv2.COLOR_BGR2RGB) # 轉換顏色通道 3 bgra = cv2.cvtColor(img, cv2.COLOR_RGB2BGRA) # 將 RGB 圖像 img 轉換為 BGRA 格式(即在 RGB 后面添加一個 alpha 通道) 4 cv2.imwrite(r'C:\Users\19225\PycharmProjects\test\src\user\static\bgra.png', bgra) # 保存圖片 5 b, g, r, a = cv2.split(bgra) # 分離顏色通道 6 a[:, :] = 125 7 ''' 8 將 alpha 通道 a 的所有像素值設置為 125。這樣可以使圖像的透明度變得半透明,255表示完全不透明,0表示完全透明。 9 ''' 10 bgra125 = cv2.merge([b, g, r, a]) # 合并顏色通道 11 cv2.imwrite(r'C:\Users\19225\PycharmProjects\test\src\user\static\bgra125.png', bgra125) # 保存圖片 12 img1 = cv2.cvtColor(bgra125, cv2.COLOR_BGRA2RGBA) # 轉換顏色通道 13 a[:, :] = 0 14 bgra0 = cv2.merge([b, g, r, a]) # 合并顏色通道 15 cv2.imwrite(r'C:\Users\19225\PycharmProjects\test\src\user\static\bgra0.png', bgra0) # 保存圖片 16 img2 = cv2.cvtColor(bgra0, cv2.COLOR_BGRA2RGBA) # 轉換顏色通道 17 pylab.subplot(1, 3, 1) # 繪制圖像 創建一個 1 行 3 列的子圖,并激活第一個子圖(位置 1) 18 pylab.imshow(img) # 顯示圖像 19 pylab.subplot(1, 3, 2) # 繪制圖像 20 pylab.imshow(img1) # 顯示圖像 21 pylab.subplot(1, 3, 3) # 繪制圖像 22 pylab.imshow(img2) # 顯示圖像 23 pylab.show() # 顯示圖像

浙公網安備 33010602011771號