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使用Beautiful Soup包编写爬虫时的一些关键点
Jan 20 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
Python时间的精准正则匹配方法分析
Aug 17 Python
Python机器学习之SVM支持向量机
Dec 27 Python
基于Python实现的微信好友数据分析
Feb 26 Python
TensorFlow实现Batch Normalization
Mar 08 Python
Python 中字符串拼接的多种方法
Jul 30 Python
Python 利用切片从列表中取出一部分使用的方法
Feb 01 Python
20行python代码实现人脸识别
May 05 Python
python3中sys.argv的实例用法
Apr 24 Python
python高级特性简介
Aug 13 Python
python try...finally...的实现方法
Nov 25 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编写的导航条程序
2006/10/09 PHP
关于PHP内存溢出问题的解决方法
2013/06/25 PHP
destoon实现VIP排名一直在前面排序的方法
2014/08/21 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
PHP微信模板消息操作示例
2017/06/29 PHP
PHP信号处理机制的操作代码讲解
2019/04/19 PHP
JavaScript闭包 懂不懂由你反正我是懂了
2011/10/21 Javascript
jquery mobile实现拨打电话功能的几种方法
2013/08/05 Javascript
JavaScript中window.showModalDialog()用法详解
2014/12/18 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
2015/08/18 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
微信小程序template模版的使用方法
2019/04/13 Javascript
js实现直播点击飘心效果
2020/08/19 Javascript
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
使用python开发vim插件及心得分享
2014/11/04 Python
python实现爬虫下载美女图片
2015/07/14 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
Django模板导入母版继承和自定义返回Html片段过程解析
2019/09/18 Python
使用已经得到的keras模型识别自己手写的数字方式
2020/06/29 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
Django框架实现在线考试系统的示例代码
2020/11/30 Python
VELTRA台湾:世界自由行专家
2017/08/15 全球购物
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
金山毒霸系列的笔试题
2013/04/13 面试题
医学生自我评价
2014/01/27 职场文书
亚运会口号
2014/06/20 职场文书
植树节口号
2014/06/21 职场文书
土地转让协议书
2014/09/27 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS