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 strip lstrip rstrip使用方法
Sep 06 Python
在主机商的共享服务器上部署Django站点的方法
Jul 22 Python
Django接受前端数据的几种方法总结
Nov 04 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
python求质数的3种方法
Sep 28 Python
在python里从协程返回一个值的示例
Feb 19 Python
python自动保存百度盘资源到百度盘中的实例代码
Aug 26 Python
Numpy的简单用法小结
Aug 28 Python
使用OpenCV实现仿射变换—旋转功能
Aug 29 Python
简单了解为什么python函数后有多个括号
Dec 19 Python
python爬虫开发之selenium模块详细使用方法与实例全解
Mar 09 Python
jupyter notebook的安装与使用详解
May 18 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
工厂模式在Zend Framework中应用介绍
2012/07/10 PHP
PHP使用ActiveMQ实例
2018/02/05 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
JavaScript 自动完成脚本整理(33个)
2009/10/20 Javascript
JavaScript类和继承 prototype属性
2010/09/03 Javascript
终于解决了IE8不支持数组的indexOf方法
2013/04/03 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
2014/09/28 Javascript
javascript数组遍历for与for in区别详解
2014/12/04 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
2016/10/10 Javascript
简单谈谈axios中的get,post方法
2017/06/25 Javascript
详解React中合并单元格的正确写法
2019/01/08 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
Pthon批量处理将pdb文件生成dssp文件
2015/06/21 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
Selenium的使用详解
2018/10/19 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2018/12/04 Python
详解Python yaml模块
2020/09/23 Python
Rag & Bone官网:瑞格布恩高级成衣
2018/04/19 全球购物
财务管理专业毕业生求职信范文
2013/09/21 职场文书
大学生年度自我鉴定
2013/10/31 职场文书
工程业务员岗位职责
2013/12/31 职场文书
合作投资意向书
2014/04/01 职场文书
农行心得体会
2014/09/02 职场文书
教师正风肃纪剖析材料
2014/10/20 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
Django显示可视化图表的实践
2021/05/10 Python
Python序列化与反序列化相关知识总结
2021/06/08 Python