華納在線開戶——SKSKFC
0.本節(jié)涉及的opencv新函數(shù)
顏色空間轉化函數(shù)?cv.cvtColor()
1.彩色的形成
“Indeed rays,properly expressed,are not colored”——牛頓。
光線為不同頻率的電磁波,人的視覺能感受到光的刺激,并且將不同頻率的電磁波感知為不同顏色,所以,彩色僅存在于人的眼睛和大腦中,物理世界分布的是帶有不同輻射能量的光線。
2.彩色空間
彩色模型建立在彩色空間之上,彩色模型和彩色空間的概念不做分別。
根據(jù)原理可以分為4類,根據(jù)應用可以分為2類
根據(jù)原理模型原理舉例比色模型/色度模型基于對光譜反射的物理測量為顏色"id",顏色最精確的表達生理學模型基于人類視網(wǎng)膜中存在的3種基本顏色感知錐細胞RGB心理物理模型/精神物理學模型基于人類對顏色的感知HSI,HCV,L*a*b*對立模型基于感知實驗HSB根據(jù)應用模型應用舉例面向硬設備顯示器,打印機RGB,CMY,CMYK面向視覺動畫,圖像處理HSI,HSB,L*a*b*
3.為什么需要選擇合適的彩色空間
人對彩色的感知與刺激視網(wǎng)膜的電磁輻射的譜能量分布,人的神經(jīng)心里學,人的生理行為等有關,感知彩色是一個很復雜的過程,應用也存在多樣性。CIE定義了若干彩色模型,每個模型都只有特定的適用情況,
沒有一種通用模型滿足所有情況,由彩色原理和彩色應用等去選擇合適的彩色模型能統(tǒng)一處理問題的維度。
4.如何選擇合適的彩色空間
了解自己的需求并尋找對應特性的彩色空間。例如,RGB模型特別適合在圖像采集輸入和圖像輸出顯示等場合應用,但與人類視覺感知有一定區(qū)別,就是當我們看到一幅圖像的時候并不能感知到他的紅綠藍各有多少分量,這個時候HSV模型就比較適配,H代表色調,S代表飽和度,V代表強度,這樣建立的模型與人的感知高度適配。
在HSV模式下分析圖像,取到圖像的V值,并減小100個像素到v1,對比觀察,能發(fā)現(xiàn),人眼就能明顯感知到亮度的變化。
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版,張毓晉,清華大學出版社)
基于?人體錐細胞,為一種與人的視覺系統(tǒng)結構密切相連的模型
視網(wǎng)膜中三種不同的感受彩色的錐細胞的波長響應曲線SML與三原色RGB基本對應
RGB模型的建立在笛卡爾坐標系統(tǒng)中
原點為黑色,離原點最遠的頂點為白色,這兩點連線上為深淺不同的灰色
CMY
三色光兩兩疊加產(chǎn)生三補色CMY,C為藍綠(綠+藍),M為品紅(紅+藍),Y為黃(紅+綠)
一般用于出版社打印,圖像處理不常用
HSI
HSI與人類感知相對應,被稱為面向用戶的彩色模型
用色調(Hue)、色飽和度(Saturation)和亮度(Intensity)來描述色彩
獨立于顯示設備
HSI的優(yōu)點:
強度分量與圖像的彩色信息無關,是獨立的, 也就是強度/亮度分量的變換并不改變圖像的色調和飽和度。
H與S獨立并且適配人的感官,使得HSI模型非常適合基于人的視覺系統(tǒng)對彩色感知特性進行處理分析的圖像算法。
HSI的缺點:
并不是均勻彩色空間模型——人所感覺到的兩點的色彩區(qū)別程度與色彩空間兩點的歐氏距離相對應。
為了更直觀的感受HSI彩色模型對人類感官的適配,代碼拆分了同一幅圖的RGB分量和HSV分量。
顏色越深則該分量值的占比越大??梢钥闯?,HSI的三幅圖看起來很不相同,表示,人眼能感覺到的HSI三個分量的區(qū)別要比RGB三個分量的區(qū)別要大
。
L*a*b*
從人的直觀感受來看,彩色模型對彩色的描述應該與人對彩色的感知越同步越好,
L\*a\*b\*是一個均勻彩色空間
,即,人所感覺到的兩點的色彩區(qū)別程度與此空間中兩點的歐氏距離相對應也是一個面向人類視覺的彩色空間,與設備無關,適合接近自然光照明的應用場合
6.變換彩色空間數(shù)學公式
每個工具包工具定義的分量范圍不同,像色調H可以是0-180也可以是0-360,在數(shù)學上,可以互相轉換。所以opencv在處理時,對于8位和16位圖像,R、 G 和 B 被轉換為浮點格式,并按比例縮放歸一化到0-1。
部分轉換公式如下:
RGB2Gray
RGB2CIE XYZ
RGB2HSV
7.opencv變換彩色空間代碼+注釋+效果
opencv的cvtColor函數(shù)實現(xiàn)色彩空間的轉換,提供了150種
顏色空間的轉換方式,只需要在cvtColor
函數(shù)的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)的第二個參數(shù)值。
print
( flags )
可以自己通過上面的代碼獲取,或者直接查詢官方文檔
這里介紹兩種轉換代碼和效果案例,分別是BGR2Gray
和BGR2HSV
(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()