python rgb库_[宜配屋]听图阁

page-header-to-2021-08-21.jpg

概要

这是这学期数字图像处理课的第一份作业好久没懂python手都快生了,调了好久才搞出来。

HSI颜色模型是一个满足计算机数字化颜色管理需要的高度抽象模拟的数学模型。HIS模型是从人的视觉系统出发,直接使用颜色三要素–色调(Hue)、饱和度(Saturation)和亮度(Intensity,有时也翻译作密度或灰度)来描述颜色。

RGB向HSI模型的转换是由一个基于笛卡尔直角坐标系的单位立方体向基于圆柱极坐标的双锥体的转换。基本要求是将RGB中的亮度因素分离,通常将色调和饱和度统称为色度,用来表示颜色的类别与深浅程度。在图中圆锥中间的横截面圆就是色度圆,而圆锥向上或向下延伸的便是亮度分量的表示。 (这里直接借鉴这篇文章:OpenCV+Python--RGB转HSI的实现)

gi5uufnle4m.jpg

从RGB空间到HSI空间的转换有多种方法,这里仅说明最为经典的几何推导法。RGB转化成HSI的公式为:

vib230bdaxm.jpg

HSI转化成RGB的公式为:

5apteyz0vwf.jpg

Python代码:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 2017/10/14 13:21

# @Author : DaiPuWei

# @Site : 理学院机房

# @File : __init__.py.py

# @Software: PyCharm Community Edition

import cv2

import numpy as np

def RGB2HSI(rgb_img):

"""

这是将RGB彩色图像转化为HSI图像的函数

:param rgm_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.0 for i in ([B,G,R])]

H = np.zeros((row, col)) #定义H通道

I = (R + G + B) / 3.0 #计算I通道

S = np.zeros((row,col)) #定义S通道

for i in range(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]

#den<0的元素h赋值为0

h[den == 0] = 0

H[i] = h/(2*np.pi) #弧度化后赋值给H通道

#计算S通道

for i in range(row):

min = []

#找出每组RGB值的最小值

for j in range(col):

arr = [B[i][j],G[i][j],R[i][j]]

min.append(np.min(arr))

min = np.array(min)

#计算S通道

S[i] = 1 - min*3/(R[i]+B[i]+G[i])

#I为0的值直接赋值0

S[i][R[i]+B[i]+G[i] == 0] = 0

#扩充到255以方便显示,一般H分量在[0,2pi]之间,S和I在[0,1]之间

hsi_img[:,:,0] = H*255

hsi_img[:,:,1] = S*255

hsi_img[:,:,2] = I*255

return hsi_img

def HSI2RGB(hsi_img):

"""

这是将HSI图像转化为RGB图像的函数

:param hsi_img: HSI彩色图像

:return: RGB图像

"""

# 保存原始图像的行列数

row = np.shape(hsi_img)[0]

col = np.shape(hsi_img)[1]

#对原始图像进行复制

rgb_img = hsi_img.copy()

#对图像进行通道拆分

H,S,I = cv2.split(hsi_img)

#把通道归一化到[0,1]

[H,S,I] = [ i/ 255.0 for i in ([H,S,I])]

R,G,B = H,S,I

for i in range(row):

h = H[i]*2*np.pi

#H大于等于0小于120度时

a1 = h >=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

return rgb_img

def run_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()

原始图像为:

e2xw4pkpfk0.jpg

自己写的RGB2HSI函数生成的HSI图片:

thbz0gf14xu.jpg

opencv库函数生成的HSI图片:

jxguj2q3uwg.jpg

用自己写的函数生成导入HSI图片执行HSI2RGB函数生成的RGB图片:

11o44nsoe2x.jpg

opencv库函数生成的HSI图片在此执行库函数生成RGB图片:

vd1viiqwj3n.jpg

以上这篇Python实现RGB与HSI颜色空间的互换方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持【听图阁-专注于Python设计】。

page-footer-to-2021-08-21.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值