python实现hsi色彩空间对亮度进行直方图均衡化并保留原有色彩
时间: 2023-07-30 18:10:08 浏览: 139
HSI颜色空间下的直方图均衡化
HSI色彩空间是将RGB颜色空间转换为色调(Hue)、饱和度(Saturation)和亮度(Intensity)三个分量的一种方式。在HSI色彩空间中,亮度分量是一个单独的分量,因此可以对其进行直方图均衡化而不会影响色调和饱和度。
下面是利用Python实现HSI色彩空间对亮度进行直方图均衡化并保留原有色彩的示例代码:
```
import cv2
import numpy as np
# 定义一个函数,将RGB颜色空间转换为HSI色彩空间
def rgb2hsi(img):
r, g, b = cv2.split(img)
h, s, i = np.zeros_like(r), np.zeros_like(r), np.zeros_like(r)
# 计算色调分量
num = 0.5 * ((r - g) + (r - b))
den = np.sqrt((r - g) ** 2 + (r - b) * (g - b))
theta = np.arccos(num / (den + 1e-6))
h[den == 0] = 0
h[r < b] = 2 * np.pi - theta[r < b]
h[r >= b] = theta[r >= b]
# 计算饱和度分量
s = 1 - 3 * np.minimum(np.minimum(r, g), b) / (r + g + b + 1e-6)
# 计算亮度分量
i = (r + g + b) / 3
# 将HSI分量转换为0-255的灰度图像
h = h * 255 / (2 * np.pi)
s = s * 255
i = i * 255
return cv2.merge([h, s, i])
# 定义一个函数,将HSI色彩空间转换回RGB颜色空间
def hsi2rgb(img):
h, s, i = cv2.split(img)
r, g, b = np.zeros_like(h), np.zeros_like(h), np.zeros_like(h)
# 将HSI分量转换为0-1的值
h = h * 2 * np.pi / 255
s = s / 255
i = i / 255
# 计算RGB分量
r[i <= 1/3] = i[i <= 1/3] * (1 + s[i <= 1/3] * np.cos(h[i <= 1/3]) / np.cos(np.pi/3 - h[i <= 1/3]))
b[i <= 1/3] = i[i <= 1/3] * (1 - s[i <= 1/3])
g[i <= 1/3] = 3 * i[i <= 1/3] - (r[i <= 1/3] + b[i <= 1/3])
h = h - 2 * np.pi / 3
r[(1/3 < i) & (i <= 2/3)] = i[(1/3 < i) & (i <= 2/3)] * (1 + s[(1/3 < i) & (i <= 2/3)] * np.cos(h[(1/3 < i) & (i <= 2/3)]) / np.cos(np.pi/3 - h[(1/3 < i) & (i <= 2/3)]))
g[(1/3 < i) & (i <= 2/3)] = i[(1/3 < i) & (i <= 2/3)] * (1 - s[(1/3 < i) & (i <= 2/3)])
b[(1/3 < i) & (i <= 2/3)] = 3 * i[(1/3 < i) & (i <= 2/3)] - (r[(1/3 < i) & (i <= 2/3)] + g[(1/3 < i) & (i <= 2/3)])
h = h - 2 * np.pi / 3
g[(2/3 < i) & (i <= 1)] = i[(2/3 < i) & (i <= 1)] * (1 + s[(2/3 < i) & (i <= 1)] * np.cos(h[(2/3 < i) & (i <= 1)]) / np.cos(np.pi/3 - h[(2/3 < i) & (i <= 1)]))
b[(2/3 < i) & (i <= 1)] = i[(2/3 < i) & (i <= 1)] * (1 - s[(2/3 < i) & (i <= 1)])
r[(2/3 < i) & (i <= 1)] = 3 * i[(2/3 < i) & (i <= 1)] - (g[(2/3 < i) & (i <= 1)] + b[(2/3 < i) & (i <= 1)])
# 将RGB分量转换为0-255的图像
r = r * 255
g = g * 255
b = b * 255
return cv2.merge([r, g, b])
# 读取图像
img = cv2.imread('image.jpg')
# 将图像转换为HSI色彩空间
hsi = rgb2hsi(img)
# 对亮度分量进行直方图均衡化
hsi[:, :, 2] = cv2.equalizeHist(hsi[:, :, 2])
# 将图像转换回RGB颜色空间
result = hsi2rgb(hsi)
# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Equalized Image', result)
cv2.waitKey(0)
```
在这段代码中,我们首先定义了两个函数`rgb2hsi`和`hsi2rgb`,用于将RGB颜色空间转换为HSI色彩空间和将HSI色彩空间转换回RGB颜色空间。然后,我们读取待处理的图像,并将其转换为HSI色彩空间。接着,我们对亮度分量进行直方图均衡化,然后将图像转换回RGB颜色空间。最后,我们显示原始图像和处理后的图像。
需要注意的是,在HSI色彩空间中,色调分量的取值范围是0到255,饱和度分量的取值范围是0到255,而亮度分量的取值范围也是0到255。因此,在将HSI分量转换为0-255的灰度图像时,需要对色调分量进行归一化。在将HSI分量转换回RGB分量时,需要将色调分量乘以2π/255,以将其转换为弧度制。
阅读全文