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 相关文章推荐
Python使用MySQLdb for Python操作数据库教程
Oct 11 Python
Python的ORM框架中SQLAlchemy库的查询操作的教程
Apr 25 Python
利用Python破解斗地主残局详解
Jun 30 Python
Django模板变量如何传递给外部js调用的方法小结
Jul 24 Python
Python使用Tkinter实现机器人走迷宫
Jan 22 Python
python入门教程 python入门神图一张
Mar 05 Python
python使用epoll实现服务端的方法
Oct 16 Python
celery4+django2定时任务的实现代码
Dec 23 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
May 08 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
Apr 20 Python
python中round函数保留两位小数的方法
Dec 04 Python
Python+Selenium自动化环境搭建与操作基础详解
Mar 13 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简单实现sql防注入的方法
2016/04/22 PHP
php常用字符函数实例小结
2016/12/29 PHP
JavaScript对象模型-执行模型
2008/04/28 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
2012/09/11 Javascript
jquery提取元素里的纯文本不包含span等里的内容
2013/09/30 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
JavaScript中常见的字符串操作函数及用法汇总
2015/05/04 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
Angular2使用jQuery的方法教程
2017/05/28 jQuery
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
在layer弹层layer.prompt中,修改placeholder的实现方法
2019/09/27 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
vue中提示$index is not defined错误的解决方式
2020/09/02 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
Python Numpy:找到list中的np.nan值方法
2018/10/30 Python
Python实现FM算法解析
2019/06/18 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
Unix控制后台进程都有哪些进程
2016/09/22 面试题
装修致歉信
2014/01/15 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
五年级下册复习计划
2015/01/19 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
体育教师研修感悟
2015/11/18 职场文书
django上传文件的三种方式
2021/04/29 Python
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
2022/02/12 Redis
JavaWeb Servlet开发注册页面实例
2022/04/11 Java/Android
使用CSS实现按钮边缘跑马灯动画
2023/05/07 HTML / CSS