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解析xml模块封装代码
Feb 07 Python
Python的另外几种语言实现
Jan 29 Python
python检测是文件还是目录的方法
Jul 03 Python
利用python批量检查网站的可用性
Sep 09 Python
Python实现购物车功能的方法分析
Nov 10 Python
PyQt实现界面翻转切换效果
Apr 20 Python
python写入已存在的excel数据实例
May 03 Python
Python中GIL的使用详解
Oct 03 Python
Python简易版图书管理系统
Aug 12 Python
python中使用you-get库批量在线下载bilibili视频的教程
Mar 10 Python
关于python的缩进规则的知识点详解
Jun 22 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
Jan 07 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
实现 win2003 下 mysql 数据库每天自动备份
2006/12/06 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
JavaScript 面向对象编程(2) 定义类
2010/05/18 Javascript
jQuery源码分析-04 选择器-Sizzle-工作原理分析
2011/11/14 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
2014/01/06 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
2018/03/03 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
vue自定v-model实现表单数据双向绑定问题
2018/09/03 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
laypage.js分页插件使用方法详解
2019/07/27 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
Vue实现可移动水平时间轴
2020/06/29 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
区分vue-router的hash和history模式
2020/10/03 Javascript
Python实现从百度API获取天气的方法
2015/03/11 Python
Python3 Random模块代码详解
2017/12/04 Python
python+POP3实现批量下载邮件附件
2018/06/19 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
我们为什么要减少Python中循环的使用
2019/07/10 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
html5指南-6.如何创建离线web应用程序实现离线访问
2013/01/07 HTML / CSS
运动鞋、街头服装、手表和手袋的实时市场:StockX
2020/11/25 全球购物
常见的软件开发流程有哪些
2015/11/14 面试题
小学优秀班集体申报材料
2014/05/25 职场文书
体现团队精神的口号
2014/06/06 职场文书
2014年文明创建工作总结
2014/11/25 职场文书
通讯稿格式及范文
2015/07/22 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书