利用python和opencv编程实现RGB 图像转换到 HSI 空间,变换 HSI 空间各通道值,看图像效果。同时,分别对 三通道直方图均衡化与单独 I 通道直方图均衡化对比相关结果
时间: 2024-02-12 18:07:12 浏览: 97
rgb图片到hsi空间的相互转化(python+opencv)
5星 · 资源好评率100%
可以使用以下代码实现RGB图像到HSI空间的转换,并对HSI空间中各通道值进行变换:
```python
import cv2
import numpy as np
# 读取图像
img = cv2.imread('image.jpg')
# RGB到HSI空间转换
b, g, r = cv2.split(img)
r, g, b = r/255.0, g/255.0, b/255.0
num = 0.5*((r-g)+(r-b))
den = np.sqrt((r-g)**2 + (r-b)*(g-b))
theta = np.arccos(num/(den+1e-7))
h = theta
h[b>g] = 2*np.pi - h[b>g]
h /= 2*np.pi
num = np.minimum(np.minimum(r, g), b)
den = r + g + b
den[den == 0] = 1e-7
s = 1 - 3*num/den
i = (r + g + b)/3.0
# 对HSI空间中各通道值进行变换
h = (h + 0.5) % 1.0
s = np.clip(s + 0.2, 0, 1)
i = np.clip(i * 1.2, 0, 1)
# HSI到RGB空间转换
h = h * 2 * np.pi
r, g, b = np.zeros_like(h), np.zeros_like(h), np.zeros_like(h)
for i, theta in np.ndenumerate(h):
if 0 <= theta < 2*np.pi/3:
b[i] = i * (1 - s[i])
r[i] = i * (1 + s[i] * np.cos(theta) / np.cos(np.pi/3 - theta))
g[i] = 3 * i - (r[i] + b[i])
elif 2*np.pi/3 <= theta < 4*np.pi/3:
theta = theta - 2*np.pi/3
r[i] = i * (1 - s[i])
g[i] = i * (1 + s[i] * np.cos(theta) / np.cos(np.pi/3 - theta))
b[i] = 3 * i - (r[i] + g[i])
else:
theta = theta - 4*np.pi/3
g[i] = i * (1 - s[i])
b[i] = i * (1 + s[i] * np.cos(theta) / np.cos(np.pi/3 - theta))
r[i] = 3 * i - (g[i] + b[i])
r, g, b = r * 255, g * 255, b * 255
r, g, b = r.astype(np.uint8), g.astype(np.uint8), b.astype(np.uint8)
img_hsi = cv2.merge((h, s, i))
img_rgb = cv2.merge((b, g, r))
# 显示图像
cv2.imshow('original', img)
cv2.imshow('hsi', img_hsi)
cv2.imshow('rgb', img_rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
上述代码中,首先读取图像,然后通过RGB到HSI空间的转换,得到HSI空间中的各通道值。接着,对HSI空间中的各通道值进行变换,然后再通过HSI到RGB空间的转换,得到RGB图像。最后,将原始图像、HSI空间图像和RGB图像显示出来。
针对本问题中的第二个问题,可以使用以下代码分别进行三通道直方图均衡化和单独I通道直方图均衡化:
```python
import cv2
# 读取图像
img = cv2.imread('image.jpg')
# 三通道直方图均衡化
b, g, r = cv2.split(img)
b_eq = cv2.equalizeHist(b)
g_eq = cv2.equalizeHist(g)
r_eq = cv2.equalizeHist(r)
img_eq = cv2.merge((b_eq, g_eq, r_eq))
# 单独I通道直方图均衡化
h, s, i = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2HSV))
i_eq = cv2.equalizeHist(i)
img_i_eq = cv2.cvtColor(cv2.merge((h, s, i_eq)), cv2.COLOR_HSV2BGR)
# 显示图像
cv2.imshow('original', img)
cv2.imshow('eq', img_eq)
cv2.imshow('i_eq', img_i_eq)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
上述代码中,首先读取图像,然后将图像分离为三个通道,并对它们分别进行直方图均衡化。接着,将图像转换到HSV空间,将I通道进行直方图均衡化,然后将图像转换回BGR空间。最后,将原始图像、三通道直方图均衡化后的图像和单独I通道直方图均衡化后的图像显示出来。
阅读全文