直方图均衡化及直方图规定化
时间: 2023-09-22 15:10:04 浏览: 41
直方图均衡化是一种图像增强技术,其目的是通过调整图像像素值的分布来增强图像的对比度和亮度。具体而言,它通过将图像像素值映射到一个更广的范围内,使图像中的像素值分布更加均匀,从而增加图像的动态范围,使得图像更加清晰明亮。
直方图规定化是一种将一张图像的灰度分布转换成另一张图像的灰度分布的技术。其主要目的是将一张图像的灰度分布匹配到另一张图像的灰度分布,从而使得两张图像在视觉上更加相似。具体而言,它通过对比两张图像的直方图来确定如何调整像素值,使得它们的直方图更加类似。这种技术在医学图像处理、计算机视觉等领域都有广泛的应用。
相关问题
直方图均衡化和规定化
直方图均衡化是一种对比度提升方法,通过对图像的像素统计分布进行调整,使得图像的直方图在全部灰度范围内均匀分布,从而增强图像的对比度。它通过对图像进行非线性拉伸,将原始图像的灰度直方图从比较集中的某个区域变成在全部灰度范围内的均匀分布。这种方法通常用来增加图像的局部对比度,特别适用于图像前景和背景明暗度差异较大的情况,可以使目标区域从背景中脱离出来。
而直方图规定化是在直方图均衡化的基础上的一种方法,它通过对原始图像进行变换,使得变换后的图像的直方图与我们规定的直方图相匹配。实际上,规定化也是一种均衡化的方法,它可以将均衡化的结果作为中间结果,建立起原始图像与固定化图像之间的联系。
简而言之,直方图均衡化是一种对比度增强的方法,通过调整图像的灰度分布使其更均匀;而直方图规定化则是在直方图均衡化的基础上,使得图像的直方图与指定的直方图相匹配,实现对图像的定制化处理。
利用python实现一张灰度级为8的图片的直方图均衡化及直方图规定化
好的,下面我将为您提供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()
```