colorsys模块(RGB/HSV/HSL/YIQ)颜色模型简介
colorsys模塊
博主最近又進入了無聊模式,沒事就翻Python標準庫讀源碼讀著玩。但是里面有幾個模塊確實規模比較大,所以坑挖了一半就停了…現在電腦桌面上一堆沒填完的坑。總之慢慢填吧…
今天發現了這么一個模塊,非常簡單,也有些實用性(對于經常用Python處理圖片的同學來說),所以在此介紹一下。
colorsys模塊提供了用于RGB和YIQ/HLS/HSV顏色模式的雙向轉換的接口。它提供了六個函數,其中三個用于將RGB轉YIQ/HLS/HSV,另外三個用于將YIQ/HLS/HSV轉為RGB。
colorsys.rgb_to_yiq(r, g, b)
colorsys.rgb_to_hls(r, g, b)
colorsys.rgb_to_hsv(r, g, b)
colorsys.yiq_to_rgb(y, i, q)
colorsys.hls_to_rgb(h, l, s)
colorsys.hsv_to_rgb(h, s, v)
需要注意的是:除了I和Q之外的其他參數取值都是在[0, 1]范圍內的浮點數。所以傳入RGB參數的時候還需要額外做一個除以255的操作。
>>> import colorsys>>> colorsys.rgb_to_hsv(30/255, 50/255, 160/255)(0.6410256410256411, 0.8125, 0.6274509803921569)- 1
- 2
- 3
具體的轉換算法在這就不介紹了,源碼里都有,也就100多行,有興趣閱讀源碼的同學可以在Python根目錄/Lib目錄下找到colorsys.py這個源文件。在這主要介紹一下模塊中涉及到的四種顏色模型。
RGB
RGB是一種相加色,也就是根據紅綠藍三種光的相互疊加來顯示不同的顏色,RGB三個字母分別代表紅色Red、綠色Green和藍色Blue。那些分辨率比較小的的顯示器用手機拍出照片后放大看,就可以看到由紅綠藍三種顏色的發光管共同組成的一個像素,像素的顏色就是由這三個發光管的亮度決定的。
HSV和HSV
HLS也就是人們常說的HSL,分別代表色相Hue,亮度Lightness和飽和度Saturation。HSV也就是HSB,用過Photoshop的同學應該對HSB不陌生,它的三個字母分別代表色相Hue,飽和度Saturation和明度Value(Brightness)。
RGB在數學上可以用一個平面直角坐標系來表示,三個坐標軸分別代表紅綠藍三色的色值。但是用RGB來表示顏色時,顏色的變化對于人類來說并不是很直觀,于是就產生了HSL和HSV。HSL和HSV通過對顏色信息的進一步封裝,使其通過一種人類更加容易感知的形式來表示顏色變化。(色調的變化、亮度的變化、色彩純度的變化)
HSL和HSV通過對RGB顏色模型進行變換,將原本的平面直角坐標系轉換為一個圓柱坐標系。HSL顏色模型的頂端是白色,底端是黑色,可以用一個雙六角錐體來表現。而HSV顏色模型可以用一個倒六角錐體來表示,錐體的頂點是黑色。下圖來自英文維基百科,展現了RGB是怎么轉換為HSL和HSV的:
注意:這兩個顏色模型中對于色相的定義是相同的,但各自對于飽和度的定義是不同的。
下面兩張同樣來自維基百科的圖片展示了這兩個模型的差異:
YIQ
YIQ顏色模型使用亮度Luminance和色度Chrominance來表示顏色。用一組坐標來表示顏色的變化,Q表示了顏色色調由紫到綠的變化,I表示了顏色色調由橙到藍的變化。
關于YIQ的特點,百度百科-顏色空間作了以下總結:
YIQ顏色空間具有能將圖像中的亮度分量分離提取出來的優點,并且YIQ顏色空間與RGB顏色空間之間是線性變換的關系,計算量小,聚類特性也比較好,可以適應光照強度不斷變化的場合,因此能夠有效地用于彩色圖像處理。
下圖來自英文維基百科:
總結
其實模塊和源碼倒沒有什么難的,難的是幾個顏色模型的概念,在bing和百度上找到的中文資料都非常有限。如果有讀者對這方面感興趣的,推薦你們讀一下下面鏈接里的參考資料,有條件的最好買圖像處理方面的專業書籍來看。
參考資料:
https://docs.python.org/3.6/library/colorsys.html
https://en.wikipedia.org/wiki/HSL_and_HSV
https://en.wikipedia.org/wiki/YIQ
總結
以上是生活随笔為你收集整理的colorsys模块(RGB/HSV/HSL/YIQ)颜色模型简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: keras中sample_weight的
- 下一篇: pyautogui在网页内写入excel