色彩
即是顏色,一種人體視覺系統(tǒng)對光的反射的不同波長的感知的結(jié)果。人們又對不同的波長范圍的電磁波定義可視光的“顏色”。
在日常生活、美術(shù)課中,通過把(紅黃藍)三種顏色成為”認為是能夠混合得到其他所有顏色的顏料。
而對于光學,就把(紅綠藍RGB)三基色【此處為了區(qū)分名字】是能夠創(chuàng)建其他顏色的基本。
例如,RGB值(255, 0, 0)表示純紅色,(0, 255, 0)表示純綠色,(0, 0, 255)表示純藍色,(0, 0, 0)表示黑色,(255, 255, 255)表示白色。
【 1 】色彩空間(色域)
一種抽象的數(shù)學模型,以不同的維度和表示方式,色彩學中,人們建立了多種色彩模型,以一維、二維、三維甚至四維空間坐標來表示某一色彩,這種坐標系統(tǒng)所能定義的色彩范圍即色彩空間。我們經(jīng)常用到的色彩空間主要有RGB、CMYK、Lab等。
常見的:
(1)RGB色彩空間
三種基本顏色的不同組合來表示顏色,在計算機圖像和電視顯示技術(shù)中廣泛使用。
與xyz色彩空間的轉(zhuǎn)換
將 RGB 色彩空間轉(zhuǎn)換為 XYZ 色彩空間
import cv2 as cv
# 讀取RGB圖像
img_rgb = cv.imread("image.jpg")
# 將RGB圖像轉(zhuǎn)換為XYZ圖像
img_xyz = cv.cvtColor(img_rgb, cv.COLOR_BGR2XYZ)
將 XYZ 色彩空間轉(zhuǎn)換為 RGB 色彩空間
import cv2 as cv
# 讀取XYZ圖像
img_xyz = cv.imread("image.jpg")
# 將XYZ圖像轉(zhuǎn)換為RGB圖像
img_rgb = cv.cvtColor(img_xyz, cv.COLOR_XYZ2BGR)
(2)CMYK色彩空間
青色(Cyan)、品紅(Magenta)、黃色(Yellow)加上黑色(Key)四種基本顏色的不同組合來表示顏色。主要用于印刷業(yè)。[全彩印刷]
此處縮寫使用最后一個字母K而非開頭的B,是因為在整體色彩學中已經(jīng)將B給了RGB的Blue藍色
(3)HSV(Hue, Saturation, Value)色彩空間
HSV代表色調(diào)(Hue)、飽和度(Saturation)、明度(Value)。
- 色調(diào)(Hue):表示顏色的種類,如紅色、藍色、綠色等。在HSV模型中,色調(diào)被表示為角度,范圍從0到360度。若從紅色開始按逆時針方向計算,紅色為0°,綠色為120°,藍色為240°。它們的補色是:黃色為60°,青色為180°,紫色為300°;
- 飽和度(Saturation):表示顏色的純度,飽和度越高,顏色越純,飽和度越低,顏色越接近灰色。在HSV模型中,飽和度的范圍是0到1。
- 明度(Value):表示顏色的亮度。在HSV模型中,明度的范圍也是0到1,0表示完全的黑色,1表示最亮的顏色。
OpenCV中,可以使用cv.cvtColor函數(shù)將RGB色彩空間轉(zhuǎn)換為HSV色彩空間
hsv_image = cv.cvtColor(rgb_image, cv.COLOR_RGB2HSV)
色調(diào)(Hue)是指光的顏色,與光的波長相關(guān)。不同的波長對應不同的色調(diào),例如紅色、橙色、黃色等。
飽和度(Saturation)表示顏色的純凈度或深淺程度。高飽和度的顏色是純凈的,沒有混合其他顏色的成分。低飽和度的顏色則含有更多的灰色或白色成分,使其看起來較淡。
亮度(Value)反映了光的明暗程度,即顏色的明亮度。較高的亮度表示顏色較亮,較低的亮度表示顏色較暗。亮度受到顏色中白色或黑色成分的影響,白色成分增加會使亮度增加,黑色成分增加會使亮度減少。
這些概念描述了顏色的不同特性,色調(diào)決定了顏色的種類,飽和度決定了顏色的純凈度,亮度決定了顏色的明暗程度。
(4)YUV和YCbCr色彩空間
Y表示亮度信息,U和V或Cb和Cr表示色度信息,這種分離的方式使得視頻壓縮更為高效。
【 2 】色彩空間轉(zhuǎn)換
是指有一種色彩空間的狀態(tài)以另一種方式表現(xiàn)出來。
例如:RGB -> HSV
或者RGB -> GRAY
而在OpenCV中,cv的表現(xiàn)是BGR
那么就是BGR向HSV或者GRAY等的轉(zhuǎn)變
cv.cvtColor(input_image,flag)
input_image 是需要進行空間轉(zhuǎn)換的圖像
flag為轉(zhuǎn)換后的類型
cv.COLOR_BGR2GRAY:bgr->gray
cv.COLOR_BGR2HSV:bgr->hsv
2.1 GRAY色彩空間
GRAY色彩空間,也被稱作灰度色彩空間,每個像素按照一個通道去 ’ 灰度 ’ 表示。
這種灰度在先前也介紹過,當時我們以二值圖像為引,二值是非黑即白的圖像,而在灰度圖中給其劃分開了 ‘ 灰度級別 ’ (只有256個灰度級別,像素值的范圍:[0,255] ,由黑向白)
它可以幫助在圖像處理和計算機視覺人物中簡化問題,降低復雜性,同時仍然保留了大部分的結(jié)構(gòu)和形狀信息。
2.1.1 轉(zhuǎn)換方式:
Gray = 0.299*R + 0.587*G + 0.114*B
這種權(quán)重分布是基于人眼對不同顏色的敏感度來設(shè)計的。人眼對綠色的敏感度最高,紅色次之,藍色最低。這是因為人眼中的視網(wǎng)膜上有三種類型的顏色感受器,分別對紅色、綠色和藍色光最為敏感。
2.1.2 BGR -> GRAY
由于OpenCV默認是BGR的顯示方式。
可以使用cvtColor
函數(shù)是OpenCV庫中的一個函數(shù),用于將圖像從一個顏色空間轉(zhuǎn)換到另一個顏色空間。
cvtColor(src, code[, dst[, dstCn]]) -> dst
The conventional ranges for R, G, and B channel values are:
. - 0 to 255 for CV_8U images
. - 0 to 65535 for CV_16U images
. - 0 to 1 for CV_32F images
參數(shù):
import numpy as np
import cv2 as cv
# 讀取一張彩色圖片
img = cv.imread('./Pic/test_img.jpg')
# 創(chuàng)建一個與輸入圖像同樣大小的空圖像,用于存儲轉(zhuǎn)換結(jié)果
dst = np.zeros_like(img)
# 使用cvtColor函數(shù)將圖片從BGR色彩空間轉(zhuǎn)換到灰度色彩空間
# 我們提供了dst參數(shù),所以函數(shù)將把轉(zhuǎn)換結(jié)果存儲在這個圖像中
# 我們也提供了dstCn參數(shù),指定輸出圖像的通道數(shù)為1
cv.cvtColor(img, cv.COLOR_BGR2GRAY, dst=dst, dstCn=1)
# 打印轉(zhuǎn)換后的圖像的通道數(shù),應該為1
print(dst.shape)
# (864, 1920, 3)
np.zeros_like(img)將創(chuàng)建一個與img具有相同形狀(即相同的行數(shù)和列數(shù))和數(shù)據(jù)類型的全零數(shù)組。這意味著返回的數(shù)組將具有與img相同的維度,并且每個元素都將被初始化為零。
這個函數(shù)在上述示例中的作用是創(chuàng)建一個與輸入圖像img具有相同大小和深度的空圖像,用于存儲cvtColor函數(shù)的轉(zhuǎn)換結(jié)果。通過使用np.zeros_like(img),我們可以確保創(chuàng)建的空圖像與輸入圖像具有相同的形狀和數(shù)據(jù)類型,從而避免了在轉(zhuǎn)換過程中出現(xiàn)大小或類型不匹配的錯誤。
原圖
沒有參數(shù)
import cv2 as cv
# 讀取一張彩色圖片
img = cv.imread('pic.jpg')
# 使用cvtColor函數(shù)將圖片從BGR色彩空間轉(zhuǎn)換到灰度色彩空間
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 打印轉(zhuǎn)換后的圖像的通道數(shù),應該為1
print(gray.shape)
2.1.3 如何證明Gray = 0.299*R + 0.587*G + 0.114*B
(1) 把彩色圖拆分成三層圖層
使用函數(shù)b,g,r=cv.split(img1)
Step1: 基本代碼
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img1=cv.imread("Pic/test_img.jpg")
# img1=cv.imread("Pic/test_img.jpg",0) 實現(xiàn)下面的同理
src=cv.cvtColor(img1,cv.COLOR_BGR2GRAY)
plt.imshow(img1[:,:,::-1])
Step2:拆分
b,g,r=cv.split(img1)
img1
Step3:拆分情況
[ 1 ] 灰度的src(原圖img1)
[ 2 ] b
[ 3 ] g
[ 4 ] r
Step4:計算(因為是整數(shù)所以會四舍五入計算)
(2)證明當圖像由 GRAY 色彩空間轉(zhuǎn)換為 RGB 色彩空間時,最終所有通道的值都將是相同的。
從灰度圖像(GRAY)轉(zhuǎn)換回RGB圖像時,所有的R、G、B通道的值都會是相同的。這是因為灰度圖像只有一個通道,所以在轉(zhuǎn)換回RGB圖像時,這個單一的通道的值會被復制到R、G、B三個通道。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 讀取灰度圖像
img_gray = cv.imread("Pic/test_img.jpg", 0)
# 將灰度圖像轉(zhuǎn)換為RGB圖像
img_rgb = cv.cvtColor(img_gray, cv.COLOR_GRAY2BGR)
# 分離RGB通道
b, g, r = cv.split(img_rgb)
# 檢查R、G、B三個通道的值是否相同
print("R == G: ", np.all(r == g))
print("R == B: ", np.all(r == b))
print("G == B: ", np.all(g == b))
首先讀取一個灰度圖像,然后將其轉(zhuǎn)換為RGB圖像。然后,它分離出R、G、B三個通道,并檢查這三個通道的值是否相同。如果所有的輸出都是True,那么就證明了在從灰度圖像轉(zhuǎn)換為RGB圖像時,所有的R、G、B通道的值都是相同的。
RGB三個通道的值
【3】類型轉(zhuǎn)換函數(shù)
dst = cv2.cvtColor( src, code [, dstCn] )
cv2.cvtColor() 是OpenCV中的一個函數(shù),用于進行顏色空間的轉(zhuǎn)換。它接受三個參數(shù):
- src:輸入圖像,可以是一個NumPy數(shù)組或一個OpenCV的Mat對象。
- code:顏色空間轉(zhuǎn)換的代碼,指定了要進行的轉(zhuǎn)換類型。常見的轉(zhuǎn)換類型包括:
- cv2.COLOR_BGR2GRAY:將BGR圖像轉(zhuǎn)換為灰度圖像。
- cv2.COLOR_BGR2HSV:將BGR圖像轉(zhuǎn)換為HSV色彩空間。
- cv2.COLOR_BGR2RGB:將BGR圖像轉(zhuǎn)換為RGB色彩空間。
- 其他轉(zhuǎn)換類型可以在OpenCV的文檔中找到。
- dstCn(可選):目標圖像的通道數(shù)。默認值為0,表示與輸入圖像的通道數(shù)相同。
函數(shù)的返回值是轉(zhuǎn)換后的圖像,以NumPy數(shù)組的形式返回。
【4】標記指定顏色
在 HSV 色彩空間中,H 通道(飽和度 Hue 通道)對應不同的顏色。
1.通過inRange函數(shù)鎖定特定值
OpenCV 中通過函數(shù) cv2.inRange()來判斷圖像內(nèi)像素點的像素值是否在指定的范圍內(nèi),其
語法格式為:
dst = cv2.inRange( src, lowerb, upperb )
式中:
? dst 表示輸出結(jié)果,大小和 src 一致。
? src 表示要檢查的數(shù)組或圖像。
? lowerb 表示范圍下界。
? upperb 表示范圍上界。
返回值 dst 與 src 等大小,其值取決于 src 中對應位置上的值是否處于區(qū)間[lowerb,upperb]
內(nèi):
? 如果 src 值處于該指定區(qū)間內(nèi),則 dst 中對應位置上的值為 255。
? 如果 src 值不處于該指定區(qū)間內(nèi),則 dst 中對應位置上的值為 0文章來源:http://www.zghlxwxcb.cn/news/detail-752668.html
HSV色彩空間
藍色的RGB值為[[[255 0 0]]],轉(zhuǎn)換為HSV值為[[[120 255 255]]]。
綠色的RGB值為[[[0 255 0]]],轉(zhuǎn)換為HSV值為[[[60 255 255]]]。
紅色的RGB值為[[[0 0 255]]],轉(zhuǎn)換為HSV值為[[[0 255 255]]]。文章來源地址http://www.zghlxwxcb.cn/news/detail-752668.html
到了這里,關(guān)于我在Vscode學OpenCV 色彩空間轉(zhuǎn)換的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!