基于直方图均衡化的彩色图像对比度增强: 将输入图像由RGB空间映射至HSV空间,保持H与S通道不变,对亮度通道V进行直方图均衡化,映射回RGB空间,保存并可视化图像的python代码
时间: 2024-01-10 20:04:16 浏览: 197
下面是基于直方图均衡化的彩色图像对比度增强的Python代码实现:
``` python
import cv2
import numpy as np
# 读取彩色图像
img = cv2.imread('input.jpg')
# 将图像从RGB空间映射至HSV空间
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 保持H与S通道不变,对亮度通道V进行直方图均衡化
hsv_img[:,:,2] = cv2.equalizeHist(hsv_img[:,:,2])
# 将图像从HSV空间映射回RGB空间
result_img = cv2.cvtColor(hsv_img, cv2.COLOR_HSV2BGR)
# 保存增强后的图像
cv2.imwrite('output.jpg', result_img)
# 可视化增强前后的图像
cv2.imshow('Input Image', img)
cv2.imshow('Output Image', result_img)
cv2.waitKey(0)
```
注意:这里的代码仅支持对jpg格式的图像进行处理,如果需要处理其他格式的图像,需要相应地修改代码。
相关问题
利用python和opencv将蔬菜 RGB 图像转换到 HSI 空间,变换 HSI 空间各通道值,看图像效果。同时,分别对HSI三通道直方图均衡化与单独 I 通道直方图均衡化对比相关结果
好的,以下是回答:
首先,我们需要导入 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)
```
完整代码如下:
彩色图像仅I通道直方图均衡化
彩色图像的直方图均衡化可以分别对每个通道进行处理,其中I通道是将RGB图像转换为灰度图像后的亮度通道。因此,彩色图像仅I通道直方图均衡化指的是仅对彩色图像的I通道进行直方图均衡化,保持色彩信息不变。具体步骤如下:
1. 将彩色图像转换为HSV色彩空间;
2. 提取亮度通道I;
3. 对I通道进行直方图均衡化;
4. 将处理后的I通道与原图像的H、S通道合并,得到处理后的彩色图像。
这种方法可以增强图像的对比度和清晰度,改善图像的视觉效果。
阅读全文