Python实现RGB与HSI颜色空间的互换方式-创新互联

概要

成都创新互联主要从事网站设计、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务象山,十年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792

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

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

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

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

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

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

HSI转化成RGB的公式为:

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

Python代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time  : 2017/10/14 13:21
# @Author : DaiPuWei
# @Site  : 理学院机房
# @File  : __init__.py.py
# @Software: PyCharm Community Edition

import cv2
import numpy as np

def 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]=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_img

def 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()

分享名称:Python实现RGB与HSI颜色空间的互换方式-创新互联
本文URL:http://scjbc.cn/article/popos.html

其他资讯