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实现一个简单的项目监控
Mar 31 Python
用Python进行简单图像识别(验证码)
Jan 19 Python
python实现单向链表详解
Feb 08 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
Jun 25 Python
Python实现的括号匹配判断功能示例
Aug 25 Python
pygame游戏之旅 载入小车图片、更新窗口
Nov 20 Python
python使用pymongo操作mongo的完整步骤
Apr 13 Python
python批量下载抖音视频
Jun 17 Python
python多线程并发及测试框架案例
Oct 15 Python
PyCharm取消波浪线、下划线和中划线的实现
Mar 03 Python
Django import export实现数据库导入导出方式
Apr 03 Python
python爬虫中抓取指数的实例讲解
Dec 01 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判断类是否存在函数class_exists用法分析
2014/11/14 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
Mac下快速搭建PHP开发环境步骤详解
2019/05/05 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
jQuery+jqmodal弹出窗口实现代码分明
2010/06/14 Javascript
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
2011/07/28 Javascript
Javascript绝句欣赏 一些经典的js代码
2012/02/22 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
2014/08/18 Javascript
JavaScript将字符串转换为整数的方法
2015/04/14 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
JSONP基础知识详解
2017/03/19 Javascript
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
2018/02/26 Javascript
使用Vue实现图片上传的三种方式
2018/07/17 Javascript
vue使用微信JS-SDK实现分享功能
2019/08/23 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
使用PYTHON接收多播数据的代码
2012/03/01 Python
python中xrange和range的区别
2014/05/13 Python
Python调用系统底层API播放wav文件的方法
2017/08/11 Python
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
python list格式数据excel导出方法
2018/10/31 Python
Window环境下Scrapy开发环境搭建
2018/11/18 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
django自带serializers序列化返回指定字段的方法
2019/08/21 Python
django ORM之values和annotate使用详解
2020/05/19 Python
Python如何执行系统命令
2020/09/23 Python
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
毕业生找工作的自我评价
2013/10/18 职场文书
老师给学生的表扬信
2014/01/17 职场文书
分公司任命书
2014/06/06 职场文书
谢师宴答谢词
2015/01/05 职场文书
SQL之各种join小结详细讲解
2021/08/04 MySQL
Python学习开发之图形用户界面详解
2021/08/23 Python
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android
Redis基本数据类型Set常用操作命令
2022/06/01 Redis