原理
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()