利用python和opencv将蔬菜 RGB 图像转换到 HSI 空间,变换 HSI 空间各通道值,看图像效果。同时,分别对HSI三通道直方图均衡化与单独 I 通道直方图均衡化对比相关结果
时间: 2024-02-13 16:02:29 浏览: 136
rgb图片到hsi空间的相互转化(python+opencv)
5星 · 资源好评率100%
好的,以下是回答:
首先,我们需要导入 OpenCV 和 NumPy 库:
```python
import cv2
import numpy as np
```
接下来,我们读取一张蔬菜的 RGB 图像:
```python
img = cv2.imread('vegetable.jpg')
```
然后,我们将 RGB 图像转换为 HSI 空间:
```python
# 将 RGB 图像转换为浮点型
img_float = np.float32(img) / 255.0
# 提取三个通道
B, G, R = cv2.split(img_float)
# 计算 H 通道
numerator = 0.5 * ((R - G) + (R - B))
denominator = np.sqrt((R - G) ** 2 + (R - B) * (G - B))
theta = np.arccos(numerator / (denominator + 1e-5))
H = theta.copy()
H[B > G] = 2 * np.pi - H[B > G]
# 计算 S 通道
S = 1 - 3 * np.minimum(np.minimum(R, G), B) / (R + G + B + 1e-5)
# 计算 I 通道
I = (R + G + B) / 3
# 将 HSI 图像转换为 OpenCV 可以显示的格式
H = H / (2 * np.pi) * 180
S = S * 255
I = I * 255
HSI = cv2.merge([H, S, I])
HSI = np.uint8(HSI)
```
接着,我们可以对 HSI 空间的三个通道进行变换,例如,我们将 H 通道加上 30 度,S 通道减去 50,I 通道加上 20:
```python
# 对 HSI 空间的三个通道进行变换
H, S, I = cv2.split(HSI)
H = (H + 30) % 180
S = np.clip(S - 50, 0, 255)
I = np.clip(I + 20, 0, 255)
HSI_transformed = cv2.merge([H, S, I])
```
最后,我们可以将 HSI 空间的图像转换回 RGB 空间,并显示出来:
```python
# 将 HSI 图像转换为 RGB 图像
HSI_transformed = np.float32(HSI_transformed)
H, S, I = cv2.split(HSI_transformed)
H = H / 180.0 * np.pi
S = S / 255.0
I = I / 255.0
B = I
G = I
R = I
for i in range(HSI_transformed.shape[0]):
for j in range(HSI_transformed.shape[1]):
if S[i, j] < 1e-5:
continue
h = H[i, j]
s = S[i, j]
i = I[i, j]
if h < 2 * np.pi / 3:
B[i, j] = i * (1 - s)
R[i, j] = i * (1 + s * np.cos(h) / np.cos(np.pi / 3 - h))
G[i, j] = 3 * i - (R[i, j] + B[i, j])
elif h < 4 * np.pi / 3:
h = h - 2 * np.pi / 3
R[i, j] = i * (1 - s)
G[i, j] = i * (1 + s * np.cos(h) / np.cos(np.pi / 3 - h))
B[i, j] = 3 * i - (R[i, j] + G[i, j])
else:
h = h - 4 * np.pi / 3
G[i, j] = i * (1 - s)
B[i, j] = i * (1 + s * np.cos(h) / np.cos(np.pi / 3 - h))
R[i, j] = 3 * i - (G[i, j] + B[i, j])
RGB = cv2.merge([B, G, R])
RGB = np.uint8(np.clip(RGB * 255.0, 0, 255))
# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Transformed Image', RGB)
cv2.imshow('Original Histogram', cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
cv2.imshow('HSI Histogram', cv2.cvtColor(HSI, cv2.COLOR_BGR2GRAY))
cv2.imshow('Transformed Histogram', cv2.cvtColor(RGB, cv2.COLOR_BGR2GRAY))
cv2.waitKey(0)
```
最后,我们可以分别对 HSI 空间的三个通道和单独的 I 通道进行直方图均衡化,然后进行对比。具体实现方法如下:
对 HSI 空间的三个通道进行直方图均衡化:
```python
# 对 HSI 空间的三个通道进行直方图均衡化
H, S, I = cv2.split(HSI)
H = cv2.equalizeHist(H)
S = cv2.equalizeHist(S)
I = cv2.equalizeHist(I)
HSI_equalized = cv2.merge([H, S, I])
```
对单独的 I 通道进行直方图均衡化:
```python
# 对单独的 I 通道进行直方图均衡化
H, S, I = cv2.split(HSI)
I = cv2.equalizeHist(I)
HSI_I_equalized = cv2.merge([H, S, I])
```
然后,我们可以将直方图均衡化后的图像显示出来:
```python
# 显示直方图均衡化的结果
cv2.imshow('HSI Equalized', cv2.cvtColor(HSI_equalized, cv2.COLOR_HSV2BGR))
cv2.imshow('HSI I Equalized', cv2.cvtColor(HSI_I_equalized, cv2.COLOR_HSV2BGR))
cv2.waitKey(0)
```
完整代码如下:
阅读全文