Python实现RGB与HSI颜色空间的互换方式


Posted in Python onNovember 27, 2019

概要

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

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

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

Python实现RGB与HSI颜色空间的互换方式

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

Python实现RGB与HSI颜色空间的互换方式

HSI转化成RGB的公式为:

Python实现RGB与HSI颜色空间的互换方式

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]<B[i]] = 2*np.pi-thetha[G[i]<B[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()

原始图像为:

Python实现RGB与HSI颜色空间的互换方式

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

Python实现RGB与HSI颜色空间的互换方式

opencv库函数生成的HSI图片:

Python实现RGB与HSI颜色空间的互换方式

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

Python实现RGB与HSI颜色空间的互换方式

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

Python实现RGB与HSI颜色空间的互换方式

以上这篇Python实现RGB与HSI颜色空间的互换方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
零基础写python爬虫之爬虫的定义及URL构成
Nov 04 Python
Python找出文件中使用率最高的汉字实例详解
Jun 03 Python
使用Python制作微信跳一跳辅助
Jan 31 Python
Python爬虫实战:分析《战狼2》豆瓣影评
Mar 26 Python
实例介绍Python中整型
Feb 11 Python
Python 监测文件是否更新的方法
Jun 10 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
Jul 22 Python
Python使用Pandas对csv文件进行数据处理的方法
Aug 01 Python
win10系统下python3安装及pip换源和使用教程
Jan 06 Python
python统计字符串中字母出现次数代码实例
Mar 02 Python
如何在Python3中使用telnetlib模块连接网络设备
Sep 21 Python
matplotlib实现数据实时刷新的示例代码
Jan 05 Python
OpenCV+Python--RGB转HSI的实现
Nov 27 #Python
解决pycharm启动后总是不停的updating indices...indexing的问题
Nov 27 #Python
python的range和linspace使用详解
Nov 27 #Python
python定间隔取点(np.linspace)的实现
Nov 27 #Python
Python进程池Pool应用实例分析
Nov 27 #Python
python进程池实现的多进程文件夹copy器完整示例
Nov 27 #Python
python list数据等间隔抽取并新建list存储的例子
Nov 27 #Python
You might like
php 从数据库提取二进制图片的处理代码
2009/09/09 PHP
PHP ? EasyUI DataGrid 资料取的方式介绍
2012/11/07 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
初识PHP中的Swoole
2016/04/05 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
jQuery :first选择器使用介绍
2013/08/09 Javascript
用js代码改变单选框选中状态的简单实例
2013/12/18 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
JS常用函数使用指南
2014/11/23 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
javascript瀑布流式图片懒加载实例
2020/06/28 Javascript
微信小程序(应用号)简单实例应用及实例详解
2016/09/26 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
2016/12/11 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
微信小程序 导入图标实现过程详解
2019/10/11 Javascript
axios解决高并发的方法:axios.all()与axios.spread()的操作
2020/11/09 Javascript
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
[35:39]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第二场 11.22
2020/11/24 DOTA
使用python检测主机存活端口及检查存活主机
2015/10/12 Python
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
2018/04/25 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
利用Python将图片中扭曲矩形的复原
2020/09/07 Python
python中time.ctime()实例用法
2021/02/03 Python
品恩科技软件测试面试题
2014/10/26 面试题
教师优秀党员事迹材料
2014/08/14 职场文书
成都人事代理协议书
2014/10/25 职场文书
社区党务工作总结2015
2015/05/19 职场文书
浅谈pytorch中的dropout的概率p
2021/05/27 Python
css让页脚保持在底部位置的四种方案
2022/07/23 HTML / CSS