OpenCV+Python--RGB转HSI的实现


Posted in Python onNovember 27, 2019

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

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

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

OpenCV+Python--RGB转HSI的实现

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

OpenCV+Python--RGB转HSI的实现

下面直接上代码:

import cv2
import numpy as np

def 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.0
  g = g / 255.0
  r = r / 255.0
  hsi_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 = 0
      elif b[i, j] <= g[i, j]:
        H = theta
      else:
        H = 2*3.14169265 - theta

      min_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 = 0
      else:
        S = 1 - 3*min_RGB/sum

      H = H/(2*3.14159265)
      I = sum/3.0
      # 输出HSI图像,扩充到255以方便显示,一般H分量在[0,2pi]之间,S和I在[0,1]之间
      hsi_lwpImg[i, j, 0] = H*255
      hsi_lwpImg[i, j, 1] = S*255
      hsi_lwpImg[i, j, 2] = I*255
  return 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) & 0xFF
  if key == ord('q'):
    cv2.destroyAllWindows()

OpenCV+Python--RGB转HSI的实现

以上这篇OpenCV+Python--RGB转HSI的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 Python
Python中super关键字用法实例分析
May 28 Python
python编程实现归并排序
Apr 14 Python
Python中print和return的作用及区别解析
May 05 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
Python 3.6打包成EXE可执行程序的实现
Oct 18 Python
Anconda环境下Vscode安装Python的方法详解
Mar 29 Python
利用Python实现斐波那契数列的方法实例
Jul 26 Python
解决hive中导入text文件遇到的坑
Apr 07 Python
tensorboard 可视化之localhost:6006不显示的解决方案
May 22 Python
Python中with上下文管理协议的作用及用法
Mar 18 Python
使用python绘制分组对比柱状图
Apr 21 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
Python如何使用Gitlab API实现批量的合并分支
Nov 27 #Python
You might like
PHP HTML代码串截取代码
2008/12/29 PHP
怎样搭建PHP开发环境
2015/07/28 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
用js实现上传图片前的预览(TX的面试题)
2007/08/14 Javascript
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
JavaScript的jQuery库中ready方法的学习教程
2015/08/14 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
angular4自定义组件详解
2017/09/28 Javascript
利用Javascript开发一个二维周视图日历
2017/12/14 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
微信小程序身份证验证方法实现详解
2019/06/28 Javascript
Vue防止白屏添加首屏动画的实例
2019/10/31 Javascript
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
python版本的读写锁操作方法
2016/04/25 Python
python rsa 加密解密
2017/03/20 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
2020/05/03 Python
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
new修饰符是起什么作用
2015/06/28 面试题
大学生创业感言
2014/01/25 职场文书
银行开业庆典方案
2014/02/06 职场文书
五年级学生评语
2014/04/22 职场文书
导师就业推荐信范文
2014/05/22 职场文书
公民授权委托书范本
2014/09/17 职场文书
2014年工人工作总结
2014/11/25 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
Python基础之赋值,浅拷贝,深拷贝的区别
2021/04/30 Python
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python