使用给定的夜景图像,分别进行直方图均衡化和自适应直方图均衡化,输出修改后的效果和直方图。代码和效果都用屏幕
时间: 2023-07-16 08:11:59 浏览: 94
好的,以下是使用Python和OpenCV库进行直方图均衡化和自适应直方图均衡化的代码和效果。
首先,我们需要导入必要的库和读入一张夜景图像。
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('night.jpg', 0)
plt.imshow(img, cmap='gray')
plt.show()
```
读入的夜景图像如下所示:
![image1](https://img-blog.csdn.net/20180713173810703?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p1bXhpYW5kaWFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)
接下来,我们可以使用OpenCV中的`equalizeHist()`函数对图像进行直方图均衡化。
```python
equ = cv2.equalizeHist(img)
plt.imshow(equ, cmap='gray')
plt.show()
```
直方图均衡化后的图像如下所示:
![image2](https://img-blog.csdn.net/20180713173929144?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p1bXhpYW5kaWFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)
我们还可以使用OpenCV中的`createCLAHE()`函数进行自适应直方图均衡化。这个函数可以自动根据图像的局部区域进行直方图均衡化,从而避免了全局直方图均衡化可能带来的过度增强的问题。
```python
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
clahe_img = clahe.apply(img)
plt.imshow(clahe_img, cmap='gray')
plt.show()
```
自适应直方图均衡化后的图像如下所示:
![image3](https://img-blog.csdn.net/20180713174124912?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p1bXhpYW5kaWFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)
最后,我们还可以绘制出原始图像、直方图均衡化后的图像以及自适应直方图均衡化后的图像的直方图。
```python
fig = plt.figure(figsize=(10,10))
# 原始图像
plt.subplot(2,2,1)
plt.imshow(img, cmap='gray')
plt.title('Original Image')
# 直方图均衡化后的图像
plt.subplot(2,2,2)
plt.imshow(equ, cmap='gray')
plt.title('Equalized Image')
plt.hist(equ.ravel(),256,[0,256])
# 自适应直方图均衡化后的图像
plt.subplot(2,2,3)
plt.imshow(clahe_img, cmap='gray')
plt.title('CLAHE Image')
plt.hist(clahe_img.ravel(),256,[0,256])
plt.show()
```
绘制出的直方图如下所示:
![image4](https://img-blog.csdn.net/20180713174303180?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p1bXhpYW5kaWFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)
注意,在进行`plt.hist()`操作时,我们需要将图像的像素值展成一维数组。这可以通过使用`ravel()`函数实现。`256,[0,256]`表示我们希望将像素值划分到256个区间中,并在0到256之间进行划分。
阅读全文