首頁 > 軟體

opencv+影象處理(Image Processing in OpenCV) 4-0改變顏色空間的過程

2023-09-06 06:00:12

本專欄程式碼地址https://github.com/xiawei20161308104/xv_opencv_tutorials
本節程式碼路徑xv_opencv_tutorials/ImageProcessinginOpenCV/changing_colorspaces.py
參考 影象工程第4版,張毓晉,清華大學出版社

0.本節涉及的opencv新函數

顏色空間轉化函數 cv.cvtColor()

1.彩色的形成

“Indeed rays,properly expressed,are not colored”——牛頓。

光線為不同頻率的電磁波,人的視覺能感受到光的刺激,並且將不同頻率的電磁波感知為不同顏色,所以,彩色僅存在於人的眼睛和大腦中,物理世界分佈的是帶有不同輻射能量的光線。

2.彩色空間

彩色模型建立在彩色空間之上,彩色模型和彩色空間的概念不做分別。
根據原理可以分為4類,根據應用可以分為2類

根據原理模型原理舉例
比色模型/色度模型基於對光譜反射的物理測量為顏色"id",顏色最精確的表達
生理學模型基於人類視網膜中存在的3種基本顏色感知錐細胞RGB
心理物理模型/精神物理學模型基於人類對顏色的感知HSI,HCV,L*a*b*
對立模型基於感知實驗HSB
根據應用模型應用舉例
面向硬裝置顯示器,印表機RGB,CMY,CMYK
面向視覺動畫,影象處理HSI,HSB,L*a*b*

3.為什麼需要選擇合適的彩色空間

人對彩色的感知與刺激視網膜的電磁輻射的譜能量分佈,人的神經心裡學,人的生理行為等有關,感知彩色是一個很複雜的過程,應用也存在多樣性。CIE定義了若干彩色模型,每個模型都只有特定的適用情況,
沒有一種通用模型滿足所有情況,由彩色原理和彩色應用等去選擇合適的彩色模型能統一處理問題的維度。

4.如何選擇合適的彩色空間

瞭解自己的需求並尋找對應特性的彩色空間。例如,RGB模型特別適合在影象採集輸入和影象輸出顯示等場合應用,但與人類視覺感知有一定區別,就是當我們看到一幅影象的時候並不能感知到他的紅綠藍各有多少分量,這個時候HSV模型就比較適配,H代表色調,S代表飽和度,V代表強度,這樣建立的模型與人的感知高度適配。
在HSV模式下分析影象,取到影象的V值,並減小100個畫素到v1,對比觀察,能發現,人眼就能明顯感知到亮度的變化。

def main():  
    # 讀取影象  
    src = cv.imread("../imgs/opencv.png")  
    # 轉換HSV空間  
    hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)  
    # 分離通道  
    h, s, v = cv.split(hsv)  
    cv.namedWindow("v", cv.WINDOW_NORMAL)  
    cv.imshow("v", v)  
    # 減小亮度  
    v1 = v - 30  
    cv.namedWindow("v1", cv.WINDOW_NORMAL)  
    cv.imshow("v1", v1)  
  
    cv.waitKey(0)  
    cv.destroyAllWindows()

5.常用的彩色空間 RGB

(出自影象工程第4版,張毓晉,清華大學出版社)

  • 基於 人體錐細胞,為一種與人的視覺系統結構密切相連的模型
  • 視網膜中三種不同的感受彩色的錐細胞的波長響應曲線SML與三原色RGB基本對應
  • RGB模型的建立在笛卡爾座標系統中
  • 原點為黑色,離原點最遠的頂點為白色,這兩點連線上為深淺不同的灰色

CMY

  • 三色光兩兩疊加產生三補色CMY,C為藍綠(綠+藍),M為品紅(紅+藍),Y為黃(紅+綠)
  • 一般用於出版社列印,影象處理不常用

HSI

  • HSI與人類感知相對應,被稱為面向使用者的彩色模型
  • 用色調(Hue)、色飽和度(Saturation)和亮度(Intensity)來描述色彩
  • 獨立於顯示裝置
  • HSI的優點:
    • 強度分量與影象的彩色資訊無關,是獨立的, 也就是強度/亮度分量的變換並不改變影象的色調和飽和度。
    • H與S獨立並且適配人的感官,使得HSI模型非常適合基於人的視覺系統對彩色感知特性進行處理分析的影象演演算法。
  • HSI的缺點:
    • 並不是均勻彩色空間模型——人所感覺到的兩點的色彩區別程度與色彩空間兩點的歐氏距離相對應。

為了更直觀的感受HSI彩色模型對人類感官的適配,程式碼拆分了同一幅圖的RGB分量和HSV分量。

顏色越深則該分量值的佔比越大。可以看出,HSI的三幅圖看起來很不相同,表示,人眼能感覺到的HSI三個分量的區別要比RGB三個分量的區別要大

L*a*b*

  • 從人的直觀感受來看,彩色模型對彩色的描述應該與人對彩色的感知越同步越好,L*a*b*是一個均勻彩色空間,即,人所感覺到的兩點的色彩區別程度與此空間中兩點的歐氏距離相對應
  • 也是一個面向人類視覺的彩色空間,與裝置無關,適合接近自然光照明的應用場合

6.變換彩色空間數學公式

每個工具包工具定義的分量範圍不同,像色調H可以是0-180也可以是0-360,在數學上,可以互相轉換。所以opencv在處理時,對於8位元和16位元影象,R、 G 和 B 被轉換為浮點格式,並按比例縮放歸一化到0-1。
部分轉換公式如下:

  • RGB2Gray

  • RGB2CIE XYZ

  • RGB2HSV

7.opencv變換彩色空間程式碼+註釋+效果

opencv的cvtColor函數實現色彩空間的轉換,提供了150種顏色空間的轉換方式,只需要在cvtColor函數的flag位填寫對應的轉換標識即可。轉換標識獲取如下。

import cv2 as cv  
flags = [i for i in dir(cv) if i.startswith('COLOR_')]  
#這裡會輸出150種flag,他們是opencv定義的彩色空間轉換flag,是cv.cvtColor(input_image, flag)的第二個引數值。
print( flags )

可以自己通過上面的程式碼獲取,或者直接查詢官方檔案

這裡介紹兩種轉換程式碼和效果案例,分別是BGR2GrayBGR2HSV(opencv中沒提供HSI,但這兩個彩色空間差不多

#BGR2Gray
import cv2 as cv  
def main():   
	src = cv.imread("../imgs/opencv.png")
    cv.namedWindow("input", cv.WINDOW_AUTOSIZE)  
    cv.imshow("input", src)  
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)  
    cv.imwrite('gray.png', gray)  
    cv.imshow("gray", gray)  
    cv.waitKey(0)  
    cv.destroyAllWindows()  
if __name__ == "__main__":  
    main()

def main():  
    src = cv.imread("../imgs/opencv.png")  
    cv.namedWindow("input", cv.WINDOW_AUTOSIZE)  
    cv.imshow("input", src)  
  
    hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)  
    cv.imwrite('hsv.png', hsv)  
    cv.imshow("hsv", hsv)  
    # 分離通道  
    h, s, v = cv.split(hsv)  
    cv.namedWindow("h", cv.WINDOW_NORMAL)  
    cv.imshow("h", h)  
    cv.namedWindow("s", cv.WINDOW_NORMAL)  
    cv.imshow("s", s)  
    cv.namedWindow("v", cv.WINDOW_NORMAL)  
    cv.imshow("v", v)  
  
    cv.waitKey(0)  
    cv.destroyAllWindows()  

if __name__ == "__main__":  
    main()

到此這篇關於opencv+影象處理(Image Processing in OpenCV) 4-0改變顏色空間的文章就介紹到這了,更多相關opencv影象處理改變顏色空間內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com