opencv+圖像處理(Image Processing in OpenCV) 4-0改變顏色空間的過(guò)程
本專欄代碼地址
https://github.com/xiawei20161308104/xv_opencv_tutorials
本節(jié)代碼路徑xv_opencv_tutorials/ImageProcessinginOpenCV/changing_colorspaces.py
參考圖像工程第4版,張毓晉,清華大學(xué)出版社
0.本節(jié)涉及的opencv新函數(shù)
顏色空間轉(zhuǎn)化函數(shù) cv.cvtColor()
1.彩色的形成
“Indeed rays,properly expressed,are not colored”——牛頓。
光線為不同頻率的電磁波,人的視覺(jué)能感受到光的刺激,并且將不同頻率的電磁波感知為不同顏色,所以,彩色僅存在于人的眼睛和大腦中,物理世界分布的是帶有不同輻射能量的光線。
2.彩色空間
彩色模型建立在彩色空間之上,彩色模型和彩色空間的概念不做分別。
根據(jù)原理可以分為4類,根據(jù)應(yīng)用可以分為2類
| 根據(jù)原理模型 | 原理 | 舉例 |
|---|---|---|
| 比色模型/色度模型 | 基于對(duì)光譜反射的物理測(cè)量 | 為顏色"id",顏色最精確的表達(dá) |
| 生理學(xué)模型 | 基于人類視網(wǎng)膜中存在的3種基本顏色感知錐細(xì)胞 | RGB |
| 心理物理模型/精神物理學(xué)模型 | 基于人類對(duì)顏色的感知 | HSI,HCV,L*a*b* |
| 對(duì)立模型 | 基于感知實(shí)驗(yàn) | HSB |
| 根據(jù)應(yīng)用模型 | 應(yīng)用 | 舉例 |
|---|---|---|
| 面向硬設(shè)備 | 顯示器,打印機(jī) | RGB,CMY,CMYK |
| 面向視覺(jué) | 動(dòng)畫,圖像處理 | HSI,HSB,L*a*b* |
3.為什么需要選擇合適的彩色空間
人對(duì)彩色的感知與刺激視網(wǎng)膜的電磁輻射的譜能量分布,人的神經(jīng)心里學(xué),人的生理行為等有關(guān),感知彩色是一個(gè)很復(fù)雜的過(guò)程,應(yīng)用也存在多樣性。CIE定義了若干彩色模型,每個(gè)模型都只有特定的適用情況,
沒(méi)有一種通用模型滿足所有情況,由彩色原理和彩色應(yīng)用等去選擇合適的彩色模型能統(tǒng)一處理問(wèn)題的維度。
4.如何選擇合適的彩色空間
了解自己的需求并尋找對(duì)應(yīng)特性的彩色空間。例如,RGB模型特別適合在圖像采集輸入和圖像輸出顯示等場(chǎng)合應(yīng)用,但與人類視覺(jué)感知有一定區(qū)別,就是當(dāng)我們看到一幅圖像的時(shí)候并不能感知到他的紅綠藍(lán)各有多少分量,這個(gè)時(shí)候HSV模型就比較適配,H代表色調(diào),S代表飽和度,V代表強(qiáng)度,這樣建立的模型與人的感知高度適配。
在HSV模式下分析圖像,取到圖像的V值,并減小100個(gè)像素到v1,對(duì)比觀察,能發(fā)現(xiàn),人眼就能明顯感知到亮度的變化。
def main():
# 讀取圖像
src = cv.imread("../imgs/opencv.png")
# 轉(zhuǎn)換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版,張毓晉,清華大學(xué)出版社)
- 基于 人體錐細(xì)胞,為一種與人的視覺(jué)系統(tǒng)結(jié)構(gòu)密切相連的模型
- 視網(wǎng)膜中三種不同的感受彩色的錐細(xì)胞的波長(zhǎng)響應(yīng)曲線SML與三原色RGB基本對(duì)應(yīng)
- RGB模型的建立在笛卡爾坐標(biāo)系統(tǒng)中
- 原點(diǎn)為黑色,離原點(diǎn)最遠(yuǎn)的頂點(diǎn)為白色,這兩點(diǎn)連線上為深淺不同的灰色
CMY
- 三色光兩兩疊加產(chǎn)生三補(bǔ)色CMY,C為藍(lán)綠(綠+藍(lán)),M為品紅(紅+藍(lán)),Y為黃(紅+綠)
- 一般用于出版社打印,圖像處理不常用
HSI

- HSI與人類感知相對(duì)應(yīng),被稱為面向用戶的彩色模型
- 用色調(diào)(Hue)、色飽和度(Saturation)和亮度(Intensity)來(lái)描述色彩
- 獨(dú)立于顯示設(shè)備
- HSI的優(yōu)點(diǎn):
- 強(qiáng)度分量與圖像的彩色信息無(wú)關(guān),是獨(dú)立的, 也就是強(qiáng)度/亮度分量的變換并不改變圖像的色調(diào)和飽和度。
- H與S獨(dú)立并且適配人的感官,使得HSI模型非常適合基于人的視覺(jué)系統(tǒng)對(duì)彩色感知特性進(jìn)行處理分析的圖像算法。
- HSI的缺點(diǎn):
- 并不是均勻彩色空間模型——人所感覺(jué)到的兩點(diǎn)的色彩區(qū)別程度與色彩空間兩點(diǎn)的歐氏距離相對(duì)應(yīng)。
為了更直觀的感受HSI彩色模型對(duì)人類感官的適配,代碼拆分了同一幅圖的RGB分量和HSV分量。

顏色越深則該分量值的占比越大??梢钥闯?,HSI的三幅圖看起來(lái)很不相同,表示,人眼能感覺(jué)到的HSI三個(gè)分量的區(qū)別要比RGB三個(gè)分量的區(qū)別要大。
L*a*b*
- 從人的直觀感受來(lái)看,彩色模型對(duì)彩色的描述應(yīng)該與人對(duì)彩色的感知越同步越好,
L\*a\*b\*是一個(gè)均勻彩色空間,即,人所感覺(jué)到的兩點(diǎn)的色彩區(qū)別程度與此空間中兩點(diǎn)的歐氏距離相對(duì)應(yīng) - 也是一個(gè)面向人類視覺(jué)的彩色空間,與設(shè)備無(wú)關(guān),適合接近自然光照明的應(yīng)用場(chǎng)合
6.變換彩色空間數(shù)學(xué)公式
每個(gè)工具包工具定義的分量范圍不同,像色調(diào)H可以是0-180也可以是0-360,在數(shù)學(xué)上,可以互相轉(zhuǎn)換。所以opencv在處理時(shí),對(duì)于8位和16位圖像,R、 G 和 B 被轉(zhuǎn)換為浮點(diǎn)格式,并按比例縮放歸一化到0-1。
部分轉(zhuǎn)換公式如下:
- RGB2Gray


- RGB2CIE XYZ

- RGB2HSV

7.opencv變換彩色空間代碼+注釋+效果
opencv的cvtColor函數(shù)實(shí)現(xiàn)色彩空間的轉(zhuǎn)換,提供了150種顏色空間的轉(zhuǎn)換方式,只需要在cvtColor函數(shù)的flag位填寫對(duì)應(yīng)的轉(zhuǎn)換標(biāo)識(shí)即可。轉(zhuǎn)換標(biāo)識(shí)獲取如下。
import cv2 as cv
flags = [i for i in dir(cv) if i.startswith('COLOR_')]
#這里會(huì)輸出150種flag,他們是opencv定義的彩色空間轉(zhuǎn)換flag,是cv.cvtColor(input_image, flag)的第二個(gè)參數(shù)值。
print( flags )可以自己通過(guò)上面的代碼獲取,或者直接查詢官方文檔
這里介紹兩種轉(zhuǎn)換代碼和效果案例,分別是BGR2Gray和BGR2HSV(opencv中沒(méi)提供HSI,但這兩個(gè)彩色空間差不多
#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()
到此這篇關(guān)于opencv+圖像處理(Image Processing in OpenCV) 4-0改變顏色空間的文章就介紹到這了,更多相關(guān)opencv圖像處理改變顏色空間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django異步任務(wù)線程池實(shí)現(xiàn)原理
這篇文章主要介紹了Django異步任務(wù)線程池實(shí)現(xiàn)原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Python使用pyfinance包進(jìn)行證券收益分析
在查找如何使用Python實(shí)現(xiàn)滾動(dòng)回歸時(shí),發(fā)現(xiàn)一個(gè)很有用的量化金融包——pyfinance。顧名思義,pyfinance是為投資管理和證券收益分析而構(gòu)建的Python分析包,主要是對(duì)面向定量金融的現(xiàn)有包進(jìn)行補(bǔ)充,如pyfolio和pandas等。pyfinance包含六個(gè)模塊,下面將一一介紹2021-11-11
Python 實(shí)現(xiàn)判斷圖片格式并轉(zhuǎn)換,將轉(zhuǎn)換的圖像存到生成的文件夾中
今天小編就為大家分享一篇Python判斷圖片格式并轉(zhuǎn)換,將轉(zhuǎn)換的圖像存到生成的文件夾中,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
跟老齊學(xué)Python之網(wǎng)站的結(jié)構(gòu)
本教程的最終目的就是教會(huì)大家如何使用Python制作網(wǎng)站,非常的詳盡,需要的朋友可以參考下2014-10-10
Django開發(fā)中使用Ueditor上傳圖片遇到的坑及解決
在Django開發(fā)中使用Ueditor上傳圖片時(shí),可能會(huì)遇到后端配置不正確的問(wèn)題,建議在實(shí)例化Ueditor后加上serverUrl,這可以在Chrome的F12工具中查看請(qǐng)求的后端配置項(xiàng),此外,如果需要修改上傳路徑,可以在配置文件中更改路徑,并調(diào)整view.py中的代碼來(lái)管理上傳文件2024-09-09
Python中join函數(shù)簡(jiǎn)單代碼示例
這篇文章主要介紹了Python中join函數(shù)簡(jiǎn)單代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01

