RGB图像转换为HIS彩色模型的python实现——数字图像处理

原理

RGB图像
RGB图像就是常见的数字图像,它采用红色?、绿色(G)、蓝色(B)三原色的强度来表示每个像素的颜色信息。
RGB图像的几个关键特征和原理:
颜色空间:RGB图像使用RGB三原色颜色空间来描述图像中的颜色信息。每个像素用红色、绿色、蓝色三个颜色通道的强度值来表示。
像素表示:图像由一定大小的矩阵描述,每一个矩阵元素称为一个像素,每个像素用三个颜色通道(R、G、B值)来表示该位置的颜色。
色度值表示:每个颜色通道的强度值通常用0-255这256个数字来表示,0表示没有这个颜色,255表示此颜色最浓。三个数值一起就可以唯一表示一个颜色。
数字存储:RGB图像通常以数字形式存储,每个像素用三个8位二进制数表示每个颜色通道的强度值,这样一个像素需要3*8=24bit的存储空间。
显示原理:显示器通过控制每个独立像素点R、G、B三个颜色通道的强度来调和产生不同颜色,利用人眼视觉混合原理即可还原图像颜色。
应用范围:RGB图像广泛应用于照相机拍摄的照片、视频画面、数字显示等场合,它利用三原色原理实现了广泛的颜色还原。

HIS模型
HIS模型是一种颜色模型,它通过色调(Hue)、饱和度(Saturation)和亮度(Intensity)三个参数来描述颜色,被称为HSI颜色模型。

HIS模型的主要特点如下:

色调(Hue):表示颜色的种类,如红色、绿色等。取值范围0-360度。

饱和度(Saturation):反映颜色的纯度,值越大颜色越鲜艳。取值范围0-1。

亮度(Intensity):表示颜色的明暗程度,与人眼感知更相关。取值范围0-1。

HIS与人眼识别颜色的机制更相符,直观描述了颜色的特征。
它消除了RGB下同一颜色可能有多个表示的问题。
HIS通过矩阵变换可以转换到RGB空间,反之亦然。在图像处理中,可单独修改H/S/I三个参数来调整图像色调、饱和度和亮度。在医学图像处理中广泛应用,如分割肿瘤、识别皮肤病灶等。
所以总体来说,HIS模型利用色调、饱和度和亮度三个人眼更容易辨识的颜色属性,来取代RGB下基于光学三色的表示方法,实现了一种更加人体直观的颜色描述体系。它在图像处理和分析中广泛应用。

RGB图像转换为HIS彩色模型的原理:

HIS(Hue, Saturation, Intensity)模型与RGB模型都是颜色空间,用于描述颜色。HIS模型采用色相(H)、饱和度(S)和亮度(I)来描述颜色,与我们观察颜色的方式更贴近。
RGB模型采用红?、绿(G)、蓝(B)三原色的强度来描述颜色。由于它们是相互独立的,同一颜色在RGB下可能有多个表示,导致颜色描述不够直观。
在RGB到HIS的转换中,第一步是计算颜色的明度I,它是R、G、B三个通道的平均值:
I = (R + G + B) / 3
第二步是计算颜色的饱和度S。S为0表示灰色,值越大饱和度越高。它利用I和颜色的明度差来计算:
S = 1 - min(R,G,B) / I

最后一步是计算颜色的色相H。H的值范围为0到360度,表示颜色的环状变化。它需要根据R、G、B分量来计算:
如果Δ = G - B, Σ = R - G + B
则 H = cos?1[(0.5*(Σ/√(R2 + G2 + B2))) / S] / 2π * 360

代码实现下图

在这里插入图片描述

提示

结果显示了该RGB图像转换到HSI彩色模型中得到的色调、饱和度、强度分量.具体计算公式见课本9.14-9.17.注意,计算前需要把R,G,B分量归一化到[0,1]范围内,转换后还需要注意两点:当I=0时,S没有意义,定义为0;当S=0时,对应的是灰度值,H没有意义,定义为0。

代码实现

import cv2
import math
import numpy as np
from matplotlib import pyplot as plt

def RGB2HSI(r, g, b):
    r = r / 255
    g = g / 255
    b = b / 255

    num = 0.5 * ((r-g) + (r-b))
    den = ((r-g) ** 2 + (r-b) * (g-b)) ** 0.5
    h = math.acos(num / (den+1e-10))
    if b > g:
        h = 2*np.pi - h

    s = 1 - 3*min(r, g, b) / (r+g+b+1e-10)
    i = (r+g+b) / 3

    return h, s, i


img = cv2.imread('Fig0616.tif')
rows = img.shape[0]
cols = img.shape[1]

H = np.zeros((rows, cols))
S = np.zeros((rows, cols))
I = np.zeros((rows, cols))

for x in range(rows):
    for y in range(cols):
        r, g, b = img[x, y, :]
        H[x, y], S[x, y], I[x, y] = RGB2HSI(r, g, b)

# 当I=0时,S没有意义,定为0
S[I==0] = 0
# 当S=0时,对应的是灰度值,H没有意义,定为0
H[S<1] = H.min()

plt.subplot(2, 2, 1)
plt.imshow(img)
plt.axis('off')
plt.title('RGB')

plt.subplot(2, 2, 2)
plt.imshow(H, cmap='gray')
plt.axis('off')
plt.title('H')

plt.subplot(2, 2, 3)
plt.imshow(S, cmap='gray')
plt.axis('off')
plt.title('S')

plt.subplot(2, 2, 4)
plt.imshow(I, cmap='gray')
plt.axis('off')
plt.title('I')
plt.show()

结果展示

在这里插入图片描述