cv2.cvtColor函数封装了各种颜色空间之间的转换,唯独没有RGB与HSI之间的转换,网上查来查去也只有C++或MATLAB版本的,自己要用到python里,所以就写写python版本的。


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

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

从RGB空间到HSI空间的转换有多种方法,这里仅说明最为经典的几何推导法。RGB与HSI之间的转换关系为:


下面直接上代码:

import cv2
import numpy as npdef rgbtohsi(rgb_lwpImg):rows = int(rgb_lwpImg.shape[0])cols = int(rgb_lwpImg.shape[1])b, g, r = cv2.split(rgb_lwpImg)# 归一化到[0,1]b = b / 255.0g = g / 255.0r = r / 255.0hsi_lwpImg = rgb_lwpImg.copy()H, S, I = cv2.split(hsi_lwpImg)for i in range(rows):for j in range(cols):num = 0.5 * ((r[i, j]-g[i, j])+(r[i, j]-b[i, j]))den = np.sqrt((r[i, j]-g[i, j])**2+(r[i, j]-b[i, j])*(g[i, j]-b[i, j]))theta = float(np.arccos(num/den))if den == 0:H = 0elif b[i, j] <= g[i, j]:H = thetaelse:H = 2*3.14169265 - thetamin_RGB = min(min(b[i, j], g[i, j]), r[i, j])sum = b[i, j]+g[i, j]+r[i, j]if sum == 0:S = 0else:S = 1 - 3*min_RGB/sumH = H/(2*3.14159265)I = sum/3.0# 输出HSI图像,扩充到255以方便显示,一般H分量在[0,2pi]之间,S和I在[0,1]之间hsi_lwpImg[i, j, 0] = H*255hsi_lwpImg[i, j, 1] = S*255hsi_lwpImg[i, j, 2] = I*255return hsi_lwpImg
if __name__ == '__main__':rgb_lwpImg = cv2.imread("123.jpg")hsi_lwpImg = rgbtohsi(rgb_lwpImg)cv2.imshow('rgb_lwpImg', rgb_lwpImg)cv2.imshow('hsi_lwpImg', hsi_lwpImg)key = cv2.waitKey(0) & 0xFFif key == ord('q'):cv2.destroyAllWindows()

(OpenCV+Python)--RGB转HSI相关推荐

  1. OpenCV 颜色空间RGB 到HSI CMYK的转换 C++

    从RGB 到 HSI 的空间转换 给定一幅RGB彩色格式的图像,每个RGB像素的H分量可用下式得到: 其中 等于 饱和度分量由下式给出: 强度分量下式得出: 上式已假定RGB归一化到[0-1],且角度 ...

  2. 使用OpenCV实现RGB、HSI、CMYK颜色空间的转换

    RGB to HSI.CMYK的代码实现 前言: 在之前博文的基础上,我使用OpenCV2实现了RGB颜色空间向HIS.CMYK转换的代码.下列链接为各种经典颜色空间的介绍及转换公式的介绍. http ...

  3. OpenCV实现RGB颜色空间和HSI颜色空间的相互转换

    核心的转换公式: RGB-->HSI 截图来自中科院刘定生老师的<数字图像处理与分析>课件. HSI-->RGB 具体的数学公式参照冈萨雷斯版<数字图像处理(第三版)&g ...

  4. opencv python 将RGB表示的图像转换为HSV(或Ycbcr)表示

    参考文章:在python中使用opencv将RGB图像转换为HSV及YCrCb图像(附代码)

  5. OpenCV+python:Canny边缘检测算法

    1,边缘处理 图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用. 在空域运算中来说,对图像的锐化就是计算微分.由于数字 ...

  6. OpenCV Python在计算机视觉中的应用

    OpenCV Python教程 在这篇文章中,我们将使用Python中的OpenCv来涵盖计算机视觉的各个方面.OpenCV长期以来一直是软件开发的重要组成部分. 什么是计算机视觉? 我们考虑一个场景 ...

  7. OpenCV Python教程(2、图像元素的访问、通道分离与合并)

    OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...

  8. python中import cv2遇到的错误及安装方法_独家利用OpenCV,Python和Ubidots来构建行人计数器程序(附代码amp;解析)...

    作者:Jose Garcia 翻译:吴振东 校对:张一豪 本文约4000字,建议阅读14分钟. 本文将利用OpenCV,Python和Ubidots来编写一个行人计数器程序,并对代码进行了较为详细的讲 ...

  9. opencv python 从摄像头获取视频、帧率、分辨率等属性设置和使用

    opencv python 从摄像头获取视频.帧率.分辨率等属性设置和使用 文章目录: 1,为了获取视频,你应该创建一个 VideoCapture 对象.他的参数可以是设备的索引号,或者是一个视频文件 ...

最新文章

  1. java汉字转换成拼音_Java代码将汉字转换成拼音
  2. sap linux下配置文件,Linux下配置sapjco3
  3. 分布式系统原理 之7 基于MVCC的分布式事务
  4. [Leetcode]-containsNearbyDuplicate
  5. java excel表格数据导入
  6. 2018/7/12-纪中某C组题【jzoj4272,jzoj4273,jzoj4274】
  7. Django内置权限扩展案例
  8. svm 文本分类 matlab,livsvm文本分类总结详解
  9. MATLAB软件基础
  10. 大一c语言编程上机题库,C语言上机题库Word版
  11. Mellanox网卡不能分配VF解决方法
  12. 手把手教你玩转QQ的原创表情
  13. Windows10 Hero默认壁纸(11色)
  14. c# 从MySQL往sharpmap中加载矢量数据图层(一)
  15. 人人都是创业者:视屏和企业合并连接怎么制作
  16. 微服务 弹性伸缩_如何构建弹性微服务
  17. 修改电脑qq的聊天背景
  18. 2440开发板,210开发板,imx6开发板和4412开发板选择哪个更好呢?
  19. 基于FPGA视频图像处理系统设计
  20. 奥利给:力扣160:相交链表

热门文章

  1. 【C语言】-三子棋游戏(+五子棋详细版)
  2. csv文件导入mysql乱码解决
  3. 关于NSA病毒的启示:由硬件到软件的自主化和基于安全的特殊订制化会不会是一个必然趋势?
  4. 【luogu2835】 刻录光盘
  5. android齐刘海屏幕适配,GitHub - biganans/cocos2x-adaptation: cocos2dx 横版各种适配 iphoneX适配 齐刘海 凹凸屏...
  6. 面了一圈,还没拿到offer.....
  7. Python3 集成openpyxl 模块
  8. 计算机系统装机教程,电脑装机教程,详细教您如何给电脑装机
  9. 二进制与十进制的整数转换
  10. 笔记:JavaScript中的30个疑难杂症