侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python实现RGB与HSI颜色空间的互换方式

Python  /  管理员 发布于 7年前   350

概要

这是这学期数字图像处理课的第一份作业好久没懂python手都快生了,调了好久才搞出来。

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

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

从RGB空间到HSI空间的转换有多种方法,这里仅说明最为经典的几何推导法。RGB转化成HSI的公式为:

HSI转化成RGB的公式为:

Python代码:

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time  : 2017/10/14 13:21# @Author : DaiPuWei# @Site  : 理学院机房# @File  : __init__.py.py# @Software: PyCharm Community Editionimport cv2import numpy as npdef RGB2HSI(rgb_img):  """  这是将RGB彩色图像转化为HSI图像的函数  :param rgm_img: RGB彩色图像  :return: HSI图像  """  #保存原始图像的行列数  row = np.shape(rgb_img)[0]  col = np.shape(rgb_img)[1]  #对原始图像进行复制  hsi_img = rgb_img.copy()  #对图像进行通道拆分  B,G,R = cv2.split(rgb_img)  #把通道归一化到[0,1]  [B,G,R] = [ i/ 255.0 for i in ([B,G,R])]  H = np.zeros((row, col))  #定义H通道  I = (R + G + B) / 3.0    #计算I通道  S = np.zeros((row,col))   #定义S通道  for i in range(row):    den = np.sqrt((R[i]-G[i])**2+(R[i]-B[i])*(G[i]-B[i]))    thetha = np.arccos(0.5*(R[i]-B[i]+R[i]-G[i])/den)  #计算夹角    h = np.zeros(col)        #定义临时数组    #den>0且G>=B的元素h赋值为thetha    h[B[i]<=G[i]] = thetha[B[i]<=G[i]]    #den>0且G<=B的元素h赋值为thetha    h[G[i]<B[i]] = 2*np.pi-thetha[G[i]<B[i]]    #den<0的元素h赋值为0    h[den == 0] = 0    H[i] = h/(2*np.pi)   #弧度化后赋值给H通道  #计算S通道  for i in range(row):    min = []    #找出每组RGB值的最小值    for j in range(col):      arr = [B[i][j],G[i][j],R[i][j]]      min.append(np.min(arr))    min = np.array(min)    #计算S通道    S[i] = 1 - min*3/(R[i]+B[i]+G[i])    #I为0的值直接赋值0    S[i][R[i]+B[i]+G[i] == 0] = 0  #扩充到255以方便显示,一般H分量在[0,2pi]之间,S和I在[0,1]之间  hsi_img[:,:,0] = H*255  hsi_img[:,:,1] = S*255  hsi_img[:,:,2] = I*255  return hsi_imgdef HSI2RGB(hsi_img):  """  这是将HSI图像转化为RGB图像的函数  :param hsi_img: HSI彩色图像  :return: RGB图像  """  # 保存原始图像的行列数  row = np.shape(hsi_img)[0]  col = np.shape(hsi_img)[1]  #对原始图像进行复制  rgb_img = hsi_img.copy()  #对图像进行通道拆分  H,S,I = cv2.split(hsi_img)  #把通道归一化到[0,1]  [H,S,I] = [ i/ 255.0 for i in ([H,S,I])]  R,G,B = H,S,I  for i in range(row):    h = H[i]*2*np.pi    #H大于等于0小于120度时    a1 = h >=0    a2 = h < 2*np.pi/3    a = a1 & a2     #第一种情况的花式索引    tmp = np.cos(np.pi / 3 - h)    b = I[i] * (1 - S[i])    r = I[i]*(1+S[i]*np.cos(h)/tmp)    g = 3*I[i]-r-b    B[i][a] = b[a]    R[i][a] = r[a]    G[i][a] = g[a]    #H大于等于120度小于240度    a1 = h >= 2*np.pi/3    a2 = h < 4*np.pi/3    a = a1 & a2     #第二种情况的花式索引    tmp = np.cos(np.pi - h)    r = I[i] * (1 - S[i])    g = I[i]*(1+S[i]*np.cos(h-2*np.pi/3)/tmp)    b = 3 * I[i] - r - g    R[i][a] = r[a]    G[i][a] = g[a]    B[i][a] = b[a]    #H大于等于240度小于360度    a1 = h >= 4 * np.pi / 3    a2 = h < 2 * np.pi    a = a1 & a2       #第三种情况的花式索引    tmp = np.cos(5 * np.pi / 3 - h)    g = I[i] * (1-S[i])    b = I[i]*(1+S[i]*np.cos(h-4*np.pi/3)/tmp)    r = 3 * I[i] - g - b    B[i][a] = b[a]    G[i][a] = g[a]    R[i][a] = r[a]  rgb_img[:,:,0] = B*255  rgb_img[:,:,1] = G*255  rgb_img[:,:,2] = R*255  return rgb_imgdef run_main():  """  这是主函数  """  #利用opencv读入图片  rgb_img = cv2.imread('1.jpeg',cv2.IMREAD_COLOR)  #进行颜色空间转换  hsi_img = RGB2HSI(rgb_img)  rgb_img2 = HSI2RGB(hsi_img)  #opencv库的颜色空间转换结果  hsi_img2 = cv2.cvtColor(rgb_img,cv2.COLOR_BGR2HSV)  rgb_img3 = cv2.cvtColor(hsi_img2,cv2.COLOR_HSV2BGR)  cv2.imshow("Origin",rgb_img)  cv2.imshow("HSI", hsi_img)  cv2.imshow("RGB",rgb_img2)  cv2.imshow("OpenCV_HSI",hsi_img2)  cv2.imshow("OpenCV_RGB",rgb_img3)  cv2.imwrite("HSI.jpeg",hsi_img)  cv2.imwrite("RGB.jpeg", rgb_img2)  cv2.imwrite("OpenCV_HSI.jpeg", hsi_img2)  cv2.imwrite("OpenCV_RGB.jpeg", rgb_img3)  cv2.waitKey()  cv2.destroyAllWindows()if __name__ == '__main__':  run_main()

原始图像为:

自己写的RGB2HSI函数生成的HSI图片:

opencv库函数生成的HSI图片:

用自己写的函数生成导入HSI图片执行HSI2RGB函数生成的RGB图片:

opencv库函数生成的HSI图片在此执行库函数生成RGB图片:

以上这篇Python实现RGB与HSI颜色空间的互换方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


  • 上一条:
    python双端队列原理、实现与使用方法分析
    下一条:
    OpenCV+Python--RGB转HSI的实现
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客