OpenCV最经典的3种颜色空间(cv2.cvtColor)及互相转换
OpenCV最經典的3種顏色空間(cv2.cvtColor)及互相轉換
- 1. 效果圖
- 2. 原理
- 2.1 照明條件的重要性
- 2.2 OpenCV 中的3種顏色空間/模型
- 2.3 顏色空間的主要用途
- 3. 源碼
- 參考
OpenCV中有超過150種顏色空間,這篇博客將介紹OpenCV中最經典的3種顏色空間(RGB、HSV、 L* a* b*)及其轉換,并討論光照條件、色彩空間在計算機視覺應用中的關鍵作用。
關鍵要點是在編寫代碼前始終考慮照明條件!一般來說,控制照明條件比編寫代碼來補償在低質量下捕獲的圖像更容易。
- RGB顏色空間是計算機視覺中最常見的顏色空間,簡單但并不直觀,因為很難肉眼準確確定某種顏色由多少紅色、綠色和藍色組成。呈現為立方體。
- HSV 顏色空間很直觀,它允許沿著圓柱體而不是 RGB 立方體定義顏色。 HSV 顏色空間還為亮度/白度提供了單獨的維度,從而更容易定義顏色深淺。
- RGB 和 HSV 都無法模仿人類感知顏色的方式,而 L* a* b* 色彩空間可以感知差異,并從歐幾里得距離判斷倆種顏色的相似性。
HSV和Lab*顏色空間數值都重新縮放了以適合紙質印刷的動態范圍。
1. 效果圖
RGB原圖 VS 各通道效果圖如下:
HSV原圖 VS 各通道效果圖如下:
Value 圖本質上是一個灰度圖像——這是因為該值控制著顏色的實際亮度,而 Hue 和 Saturation 定義了實際的顏色和陰影。
L * a * b * VS 各通道效果圖如下:
與HSV示例類似,L通道專門用于顯示給定像素的亮度。 a通道和b通道確定了像素的陰影和顏色。
2. 原理
2.1 照明條件的重要性
照明可能意味著計算機視覺算法成功與失敗之間的區別。事實上,光照甚至可能是最重要的因素。
在編寫代碼之前,盡可能地獲得理想的照明條件。控制照明條件比編寫代碼來補償較低的照明條件更容易。
處理光照條件時應尋求實現的三個目標:
-
高對比度(應該尋求最大化圖像中感興趣區域之間的對比度(即想要檢測、提取、描述、分類、操作等的“對象”與圖像的其余部分具有足夠高的對比度,盡量確保環境的背景和前景之間有高對比度);
-
可推廣的(照明條件應該足夠一致,以便擴展);
-
穩定的(具有穩定、一致、可重復的光照條件是計算機視覺應用開發的圣杯。)
2.2 OpenCV 中的3種顏色空間/模型
顏色模型是在顏色空間中用數字表示顏色的一種抽象方法。
- RGB
RGB 代表圖像中的紅、綠、藍分量,通常被視為立方體。
- RGB顏色空間是加法顏色空間的一個示例:添加的顏色越多,像素越亮,越接近白色;
- [0,255]共256個值; 紅色+綠色=黃色。紅色+藍色=粉紅色。紅+綠+藍=白色。
R=252, G=198, B=188 = 白色人種膚色。
R=22,G=159,B=230=藍色徽標。
- HSV
HSV 顏色空間將其重塑為圓柱體而不是立方體,亮度是一個單獨的維度
- Hue:色調,正在檢查哪種“純”顏色。例如“紅色”顏色的所有陰影和色調都將具有相同的色調。 [0, 179]
- Saturation:飽和度,顏色有多“白”。完全飽和的顏色將是“純色”,如“純紅色”。零飽和度的顏色將是純白色。 [0, 255]
- Value:值允許控制顏色的亮度。值為零表示純黑色,而增加值會產生較淺的顏色。 [0, 255]
- Lab
在RGB 和 HSV 顏色空間中,歐幾里得距離無法“測量”各種顏色之間顏色的感知差異。 而Lab 顏色空間可以模仿人類觀察和解釋顏色的方法。 Lab 是一個3軸系統,它使得兩種任意顏色之間的歐幾里德距離具有實際的感知意義。**
- L-通道:像素的“亮度”。該值在垂直軸上上下變化,從白色到黑色,在軸的中心為中性灰色。
- a-通道:源自 L 通道的中心,在光譜的一端定義純綠色,在另一端定義純紅色。
- b 通道:源自 L 通道的中心,但垂直于 a 通道??。 b 通道在光譜中一端定義純藍色,另一端定義純黃色。 同樣,雖然 Lab* 顏色空間不如 HSV 和 RGB 顏色空間直觀且不易理解,但它在計算機視覺中得到了大量使用。
這是由于顏色之間的距離具有實際的感知意義,使我們能夠克服各種光照條件問題。它還用作強大的彩色圖像描述符。
2.3 顏色空間的主要用途
-
RGB:足夠簡單,主要用于在顯示器上顯示顏色;
-
HSV:當有興趣根據顏色跟蹤圖像中的對象時,使用 HSV 定義顏色范圍非常容易。
-
Lab:提供了感知均勻性,可以模仿人類觀察和解釋顏色的方法,使得兩種任意顏色之間的距離具有實際意義。 當關心跨多個設備的色彩管理、色彩傳輸或色彩一致性時,L * a * b色彩空間可以提供出色的彩色圖像描述符。
-
灰度:不是顏色空間,但在顏色無關緊要的應用中,例如在檢測人臉或構建對象分類器時,忽略顏色使用圖像的灰度表示——這能夠節省內存并提高計算效率。
3. 源碼
可以看到Opencv中共有274種顏色空間;
# 加載圖像,并演示如何使用RGB、HSV和L*a*b*顏色空間。
# USAGE
# python color_spaces.py# 導入必要的包
import argparse
import cv2
import imutils# 遍歷查看所有顏色空間值
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(flags)
print(len(flags))# 構建命令行參水及解析
# --image 輸入圖像路徑
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str, default="ml3.jpg",help="path to input image")
args = vars(ap.parse_args())# 加載圖像并展示
image = cv2.imread(args["image"])
image = imutils.resize(image, width=200)
cv2.imshow("RGB", image)# 遍歷每一個單獨的通道并展示
# RGB 是最常用的色彩空間,但它并不是最直觀的色彩空間。
# 顏色的“白色”或“亮度”是每個紅色、綠色和藍色分量的加法組合。
for (name, chan) in zip(("B", "G", "R"), cv2.split(image)):cv2.imshow(name, chan)# 等待按鍵,關閉所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()# HSV 顏色空間轉換 RGB 顏色空間,將其重塑為圓柱體而不是立方體,亮度是一個單獨的維度
# - Hue:色調,正在檢查哪種“純”顏色。例如“紅色”顏色的所有陰影和色調都將具有相同的色調。 [0, 179]
# - Saturation:飽和度,顏色有多“白”。完全飽和的顏色將是“純色”,如“純紅色”。零飽和度的顏色將是純白色。 [0, 255]
# - Value:值允許控制顏色的亮度。值為零表示純黑色,而增加值會產生較淺的顏色。 [0, 255]
# 轉換圖像為HSV顏色空間并展示
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
cv2.imshow("HSV", hsv)# 遍歷每一個單獨的H、S、V通道并展示
for (name, chan) in zip(("H", "S", "V"), cv2.split(hsv)):cv2.imshow(name, chan)# 按鍵關閉所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()# L * a * b顏色空間
# 計算紅色和綠色之間的歐幾里德距離;紅色和紫色;以及 RGB 顏色空間中的紅色和海軍藍:
import mathred_green = math.sqrt(((255 - 0) ** 2) + ((0 - 255) ** 2) + ((0 - 0) ** 2))
red_purple = math.sqrt(((255 - 128) ** 2) + ((0 - 0) ** 2) + ((0 - 128) ** 2))
red_navy = math.sqrt(((255 - 0) ** 2) + ((0 - 0) ** 2) + ((0 - 128) ** 2))
print(red_green, red_purple, red_navy)# 在RGB、HSV顏色空間計算歐幾里得距離,并不能得出紅色在某種意義上更類似于紫色而不是綠色?,
# 歐幾里得距離無法“測量”各種顏色之間顏色的感知差異在 RGB 和 HSV 顏色空間中。
# 這就是 L*a*b* 顏色空間的用武之地——它的目標是模仿人類觀察和解釋顏色的方法。
# L*a*b* 顏色空間中兩種任意顏色之間的歐幾里德距離具有實際的感知意義。
# 感知意義的加入使得 L*a*b* 顏色空間不如 RGB 和 HSV 那樣直觀和理解,但它在計算機視覺中被大量使用。本質上,L*a*b* 顏色空間是一個 3 軸系統:# - L-通道:像素的“亮度”。該值在垂直軸上上下變化,從白色到黑色,在軸的中心為中性灰色。
# - a-通道:源自 L 通道的中心,在光譜的一端定義純綠色,在另一端定義純紅色。
# - b 通道:也源自 L 通道的中心,但垂直于 a 通道??。 b 通道在光譜中一端定義純藍色,另一端定義純黃色。
# 同樣,雖然 L*a*b* 顏色空間不如 HSV 和 RGB 顏色空間直觀且不易理解,但它在計算機視覺中得到了大量使用。
# 這是由于顏色之間的距離具有實際的感知意義,使我們能夠克服各種光照條件問題。它還用作強大的彩色圖像描述符。
# 轉換圖像為L*a*b空間并展示
lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
cv2.imshow("L*a*b*", lab)
# 遍歷每個通道并展示
for (name, chan) in zip(("L*", "a*", "b*"), cv2.split(lab)):cv2.imshow(name, chan)# 等待按鍵,關閉所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()# 展示灰度圖,灰度圖并不是一種顏色空間
# 鑒于眼睛對色彩的敏感程度,眼睛的受體和錐體不同,因此比藍色更能感知綠色和紅色。感知綠色的量是紅色的近2被,感知紅色的量是藍色的倆倍多,
# 因此在轉換為灰度時,每個 RGB 通道的權重不均勻,
# Y = 0.299 \times R + 0.587 \times G + 0.114 \times B
# 當顏色無關緊要時,通常使用圖像的灰度表示(例如在檢測人臉或構建對象分類器時,對象的顏色無關緊要)。因此丟棄顏色能夠節省內存并提高計算效率。
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Original", image)
cv2.imshow("Grayscale", gray)
cv2.waitKey(0)
參考
- https://www.pyimagesearch.com/2021/04/28/opencv-color-spaces-cv2-cvtcolor/
- https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html#converting-colorspaces
總結
以上是生活随笔為你收集整理的OpenCV最经典的3种颜色空间(cv2.cvtColor)及互相转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python必备基本技能——命令行参数a
- 下一篇: 使用Python,Opencv绘制调色板