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 可爱的大小写
Sep 06 Python
python获取文件版本信息、公司名和产品名的方法
Oct 05 Python
Python中IPYTHON入门实例
May 11 Python
python安装与使用redis的方法
Apr 19 Python
Python中max函数用于二维列表的实例
Apr 03 Python
对python多线程SSH登录并发脚本详解
Feb 14 Python
pyqt 多窗口之间的相互调用方法
Jun 19 Python
Python实现PyPDF2处理PDF文件的方法示例
Sep 25 Python
Python帮你识破双11的套路
Nov 11 Python
python飞机大战pygame游戏之敌机出场实现方法详解
Dec 17 Python
python线程join方法原理解析
Feb 11 Python
python读取图片的几种方式及图像宽和高的存储顺序
Feb 11 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网站安装程序制作的原理、步骤、注意事项和示例代码
2010/08/01 PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
php懒人函数 自动添加数据
2011/06/28 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
2015/12/15 PHP
PHP 实现缩略图
2021/03/09 PHP
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
2015/09/04 Javascript
Javascript技术栈中的四种依赖注入详解
2016/02/23 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
vue-cli中vue本地实现跨域调试接口
2019/01/16 Javascript
python引用DLL文件的方法
2015/05/11 Python
python绘制立方体的方法
2018/07/02 Python
python递归全排列实现方法
2018/08/18 Python
对json字符串与python字符串的不同之处详解
2018/12/19 Python
python实现图片中文字分割效果
2019/07/22 Python
python的json中方法及jsonpath模块用法分析
2019/12/06 Python
Linux常见面试题
2016/10/04 面试题
迎新晚会邀请函
2014/02/01 职场文书
同事吵架检讨书
2014/02/05 职场文书
婚庆公司开业主持词
2015/06/30 职场文书
2016年优秀共青团员事迹材料
2016/02/25 职场文书
2019最新公司租房合同(例文)
2019/07/18 职场文书
“爱眼护眼,提前预防近视”倡议书3篇
2019/10/30 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
教你利用Selenium+python自动化来解决pip使用异常
2021/05/20 Python
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle