Python实现RGB与HSI颜色空间的互换方式
概要
这是这学期数字图像处理课的第一份作业好久没懂python手都快生了,调了好久才搞出来。
HSI颜色模型是一个满足计算机数字化颜色管理需要的高度抽象模拟的数学模型。HIS模型是从人的视觉系统出发,直接使用颜色三要素–色调(Hue)、饱和度(Saturation)和亮度(Intensity,有时也翻译作密度或灰度)来描述颜色。
RGB向HSI模型的转换是由一个基于笛卡尔直角坐标系的单位立方体向基于圆柱极坐标的双锥体的转换。基本要求是将RGB中的亮度因素分离,通常将色调和饱和度统称为色度,用来表示颜色的类别与深浅程度。在图中圆锥中间的横截面圆就是色度圆,而圆锥向上或向下延伸的便是亮度分量的表示。(这里直接借鉴这篇文章:OpenCV+Python--RGB转HSI的实现)
从RGB空间到HSI空间的转换有多种方法,这里仅说明最为经典的几何推导法。RGB转化成HSI的公式为:
HSI转化成RGB的公式为:
Python代码:
#!/usr/bin/envpython
#-*-coding:utf-8-*-
#@Time:2017/10/1413:21
#@Author:DaiPuWei
#@Site:理学院机房
#@File:__init__.py.py
#@Software:PyCharmCommunityEdition
importcv2
importnumpyasnp
defRGB2HSI(rgb_img):
"""
这是将RGB彩色图像转化为HSI图像的函数
:paramrgm_img:RGB彩色图像
:return:HSI图像
"""
#保存原始图像的行列数
row=np.shape(rgb_img)[0]
col=np.shape(rgb_img)[1]
#对原始图像进行复制
hsi_img=rgb_img.copy()
#对图像进行通道拆分
B,G,R=cv2.split(rgb_img)
#把通道归一化到[0,1]
[B,G,R]=[i/255.0foriin([B,G,R])]
H=np.zeros((row,col))#定义H通道
I=(R+G+B)/3.0#计算I通道
S=np.zeros((row,col))#定义S通道
foriinrange(row):
den=np.sqrt((R[i]-G[i])**2+(R[i]-B[i])*(G[i]-B[i]))
thetha=np.arccos(0.5*(R[i]-B[i]+R[i]-G[i])/den)#计算夹角
h=np.zeros(col)#定义临时数组
#den>0且G>=B的元素h赋值为thetha
h[B[i]<=G[i]]=thetha[B[i]<=G[i]]
#den>0且G<=B的元素h赋值为thetha
h[G[i]=0
a2=h<2*np.pi/3
a=a1&a2#第一种情况的花式索引
tmp=np.cos(np.pi/3-h)
b=I[i]*(1-S[i])
r=I[i]*(1+S[i]*np.cos(h)/tmp)
g=3*I[i]-r-b
B[i][a]=b[a]
R[i][a]=r[a]
G[i][a]=g[a]
#H大于等于120度小于240度
a1=h>=2*np.pi/3
a2=h<4*np.pi/3
a=a1&a2#第二种情况的花式索引
tmp=np.cos(np.pi-h)
r=I[i]*(1-S[i])
g=I[i]*(1+S[i]*np.cos(h-2*np.pi/3)/tmp)
b=3*I[i]-r-g
R[i][a]=r[a]
G[i][a]=g[a]
B[i][a]=b[a]
#H大于等于240度小于360度
a1=h>=4*np.pi/3
a2=h<2*np.pi
a=a1&a2#第三种情况的花式索引
tmp=np.cos(5*np.pi/3-h)
g=I[i]*(1-S[i])
b=I[i]*(1+S[i]*np.cos(h-4*np.pi/3)/tmp)
r=3*I[i]-g-b
B[i][a]=b[a]
G[i][a]=g[a]
R[i][a]=r[a]
rgb_img[:,:,0]=B*255
rgb_img[:,:,1]=G*255
rgb_img[:,:,2]=R*255
returnrgb_img
defrun_main():
"""
这是主函数
"""
#利用opencv读入图片
rgb_img=cv2.imread('1.jpeg',cv2.IMREAD_COLOR)
#进行颜色空间转换
hsi_img=RGB2HSI(rgb_img)
rgb_img2=HSI2RGB(hsi_img)
#opencv库的颜色空间转换结果
hsi_img2=cv2.cvtColor(rgb_img,cv2.COLOR_BGR2HSV)
rgb_img3=cv2.cvtColor(hsi_img2,cv2.COLOR_HSV2BGR)
cv2.imshow("Origin",rgb_img)
cv2.imshow("HSI",hsi_img)
cv2.imshow("RGB",rgb_img2)
cv2.imshow("OpenCV_HSI",hsi_img2)
cv2.imshow("OpenCV_RGB",rgb_img3)
cv2.imwrite("HSI.jpeg",hsi_img)
cv2.imwrite("RGB.jpeg",rgb_img2)
cv2.imwrite("OpenCV_HSI.jpeg",hsi_img2)
cv2.imwrite("OpenCV_RGB.jpeg",rgb_img3)
cv2.waitKey()
cv2.destroyAllWindows()
if__name__=='__main__':
run_main()
原始图像为:
自己写的RGB2HSI函数生成的HSI图片:
opencv库函数生成的HSI图片:
用自己写的函数生成导入HSI图片执行HSI2RGB函数生成的RGB图片:
opencv库函数生成的HSI图片在此执行库函数生成RGB图片:
以上这篇Python实现RGB与HSI颜色空间的互换方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。