利用python实现一张灰度级为8的图片的直方图均衡化及直方图规定化
时间: 2024-03-10 14:47:04 浏览: 65
好的,下面我将为您提供Python代码来实现一张灰度级为8的图片的直方图均衡化和直方图规定化。
首先,我们需要导入所需的Python库。
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
```
接下来,我们读取一张灰度级为8的图片。
```python
img = cv2.imread('gray_image.png', 0)
```
现在,我们可以使用`cv2.equalizeHist()`函数来实现直方图均衡化。这个函数需要一个灰度图像作为输入,并返回一个直方图均衡化后的图像。
```python
equ = cv2.equalizeHist(img)
```
接下来,我们可以使用`cv2.imread()`函数来读取另一张灰度级为8的图片,作为直方图规定化的目标图像。
```python
target = cv2.imread('target_image.png', 0)
```
然后,我们可以使用`cv2.calcHist()`函数来计算原始图像和目标图像的直方图。
```python
hist1 = cv2.calcHist([img], [0], None, [256], [0, 256])
hist2 = cv2.calcHist([target], [0], None, [256], [0, 256])
```
接下来,我们可以使用`cv2.normalize()`函数将两个直方图归一化到相同的范围内。
```python
hist1_norm = cv2.normalize(hist1, hist1, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX)
hist2_norm = cv2.normalize(hist2, hist2, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX)
```
现在,我们可以使用`cv2.LUT()`函数来将原始图像映射到目标直方图。
```python
lut = np.interp(hist1_norm, hist2_norm, range(256))
result = cv2.LUT(img, lut.astype('uint8'))
```
最后,我们可以将原始图像、直方图均衡化后的图像和直方图规定化后的图像显示在同一幅图像上,以便比较它们的效果。
```python
plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(equ, cmap='gray')
plt.title('Equalized Image'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(target, cmap='gray')
plt.title('Target Image'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(result, cmap='gray')
plt.title('Specified Image'), plt.xticks([]), plt.yticks([])
plt.show()
```
完整代码如下:
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Read the gray-scale image
img = cv2.imread('gray_image.png', 0)
# Perform histogram equalization
equ = cv2.equalizeHist(img)
# Read the target gray-scale image for histogram specification
target = cv2.imread('target_image.png', 0)
# Calculate the histograms for both images
hist1 = cv2.calcHist([img], [0], None, [256], [0, 256])
hist2 = cv2.calcHist([target], [0], None, [256], [0, 256])
# Normalize the histograms
hist1_norm = cv2.normalize(hist1, hist1, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX)
hist2_norm = cv2.normalize(hist2, hist2, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX)
# Calculate the lookup table for histogram specification
lut = np.interp(hist1_norm, hist2_norm, range(256))
# Use the lookup table to perform histogram specification
result = cv2.LUT(img, lut.astype('uint8'))
# Display the results
plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(equ, cmap='gray')
plt.title('Equalized Image'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(target, cmap='gray')
plt.title('Target Image'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(result, cmap='gray')
plt.title('Specified Image'), plt.xticks([]), plt.yticks([])
plt.show()
```
阅读全文