OpenCV+Python--RGB轉(zhuǎn)HSI的實(shí)現(xiàn)
cv2.cvtColor函數(shù)封裝了各種顏色空間之間的轉(zhuǎn)換,唯獨(dú)沒有RGB與HSI之間的轉(zhuǎn)換,網(wǎng)上查來查去也只有C++或MATLAB版本的,自己要用到python里,所以就寫寫python版本的。
HSI顏色模型是一個(gè)滿足計(jì)算機(jī)數(shù)字化顏色管理需要的高度抽象模擬的數(shù)學(xué)模型。HIS模型是從人的視覺系統(tǒng)出發(fā),直接使用顏色三要素–色調(diào)(Hue)、飽和度(Saturation)和亮度(Intensity,有時(shí)也翻譯作密度或灰度)來描述顏色。
RGB向HSI模型的轉(zhuǎn)換是由一個(gè)基于笛卡爾直角坐標(biāo)系的單位立方體向基于圓柱極坐標(biāo)的雙錐體的轉(zhuǎn)換?;疽笫菍GB中的亮度因素分離,通常將色調(diào)和飽和度統(tǒng)稱為色度,用來表示顏色的類別與深淺程度。在圖中圓錐中間的橫截面圓就是色度圓,而圓錐向上或向下延伸的便是亮度分量的表示。

從RGB空間到HSI空間的轉(zhuǎn)換有多種方法,這里僅說明最為經(jīng)典的幾何推導(dǎo)法。RGB與HSI之間的轉(zhuǎn)換關(guān)系為:

下面直接上代碼:
import cv2
import numpy as np
def rgbtohsi(rgb_lwpImg):
rows = int(rgb_lwpImg.shape[0])
cols = int(rgb_lwpImg.shape[1])
b, g, r = cv2.split(rgb_lwpImg)
# 歸一化到[0,1]
b = b / 255.0
g = g / 255.0
r = r / 255.0
hsi_lwpImg = rgb_lwpImg.copy()
H, S, I = cv2.split(hsi_lwpImg)
for i in range(rows):
for j in range(cols):
num = 0.5 * ((r[i, j]-g[i, j])+(r[i, j]-b[i, j]))
den = np.sqrt((r[i, j]-g[i, j])**2+(r[i, j]-b[i, j])*(g[i, j]-b[i, j]))
theta = float(np.arccos(num/den))
if den == 0:
H = 0
elif b[i, j] <= g[i, j]:
H = theta
else:
H = 2*3.14169265 - theta
min_RGB = min(min(b[i, j], g[i, j]), r[i, j])
sum = b[i, j]+g[i, j]+r[i, j]
if sum == 0:
S = 0
else:
S = 1 - 3*min_RGB/sum
H = H/(2*3.14159265)
I = sum/3.0
# 輸出HSI圖像,擴(kuò)充到255以方便顯示,一般H分量在[0,2pi]之間,S和I在[0,1]之間
hsi_lwpImg[i, j, 0] = H*255
hsi_lwpImg[i, j, 1] = S*255
hsi_lwpImg[i, j, 2] = I*255
return hsi_lwpImg
if __name__ == '__main__':
rgb_lwpImg = cv2.imread("123.jpg")
hsi_lwpImg = rgbtohsi(rgb_lwpImg)
cv2.imshow('rgb_lwpImg', rgb_lwpImg)
cv2.imshow('hsi_lwpImg', hsi_lwpImg)
key = cv2.waitKey(0) & 0xFF
if key == ord('q'):
cv2.destroyAllWindows()

以上這篇OpenCV+Python--RGB轉(zhuǎn)HSI的實(shí)現(xiàn)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python通過wordcloud庫實(shí)現(xiàn)將單詞生成詞云
Python的wordcloud庫是一個(gè)用于生成詞云的Python包,它可以將一段文本中出現(xiàn)頻率高的單詞按其出現(xiàn)頻率大小以及顏色深淺排列成一個(gè)詞云圖形,從而更好地展示文本中的信息,你可以使用wordcloud庫來生成各種類型的詞云,本文就介紹了如何生成心型詞云2023-06-06
Python數(shù)據(jù)處理之臨近匹配的實(shí)現(xiàn)詳解
在數(shù)據(jù)處理中,經(jīng)常需要找到最接近給定值的元素或數(shù)據(jù)點(diǎn),這種需求在科學(xué)、工程和統(tǒng)計(jì)分析中非常常見,Python 提供了多種方法來實(shí)現(xiàn)這種臨近匹配,下面就跟隨小編一起學(xué)習(xí)一下吧2024-02-02
pytorch GPU計(jì)算比CPU還慢的可能原因分析
這篇文章主要介紹了pytorch GPU計(jì)算比CPU還慢的可能原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
python 實(shí)現(xiàn)一次性在文件中寫入多行的方法
今天小編就為大家分享一篇python 實(shí)現(xiàn)一次性在文件中寫入多行的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01
python3實(shí)現(xiàn)釘釘消息推送的方法示例
這篇文章主要介紹了python3實(shí)現(xiàn)釘釘消息推送的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
python調(diào)用kubernetesAPI簡(jiǎn)單使用方法
這篇文章主要介紹了python調(diào)用kubernetesAPI簡(jiǎn)單使用方法,K8s也提供API接口,提供這個(gè)接口的是管理節(jié)點(diǎn)的apiserver組件,下文更多相關(guān)內(nèi)容,需要的小伙伴可以參考一下2022-05-05

