理解直方图的概念及应用,实现图像直方图的显示,及通过直方图均衡和直方图规定化方法对图像进行修正
时间: 2023-11-27 19:54:26 浏览: 85
一、理解直方图的概念及应用
直方图是一种统计图形,用于表示数据分布的情况。在图像处理中,直方图是一种表示图像亮度分布的图形,横轴表示像素的亮度值,纵轴表示该亮度值的像素数量。通过直方图可以很直观地了解图像的亮度分布情况,从而为后续的图像处理提供依据。直方图常用于图像增强、图像分割等应用中。
二、实现图像直方图的显示
图像直方图的显示可以通过以下步骤实现:
1. 读取需要显示直方图的图像;
2. 将图像转换为灰度图像;
3. 统计灰度图像中每个像素值的数量,得到直方图数据;
4. 将直方图数据绘制成直方图图形,横轴为像素值,纵轴为像素数量。
在Python中,可以使用OpenCV库的cv2.calcHist()函数和matplotlib库的plt.plot()函数实现图像直方图的显示。示例代码如下:
```python
import cv2
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('lena.jpg')
# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 计算直方图数据
hist = cv2.calcHist([gray], [0], None, [256], [0, 256])
# 绘制直方图
plt.plot(hist)
plt.show()
```
三、通过直方图均衡和直方图规定化方法对图像进行修正
1. 直方图均衡
直方图均衡可以将图像的灰度值分布均匀化,从而增强图像的对比度。具体步骤如下:
1. 将图像转换为灰度图像;
2. 计算灰度图像的直方图;
3. 计算每个像素值在直方图中的累积分布函数(CDF);
4. 将CDF线性映射到[0, 255]范围内,得到新的灰度值;
5. 将图像中每个像素的灰度值映射到新的灰度值,得到均衡化后的图像。
在Python中,可以使用OpenCV库的cv2.equalizeHist()函数实现直方图均衡。示例代码如下:
```python
import cv2
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('lena.jpg')
# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 直方图均衡
equ = cv2.equalizeHist(gray)
# 显示均衡化前后的图像和直方图
plt.subplot(2, 2, 1)
plt.imshow(gray, cmap='gray')
plt.title('Original Image')
plt.subplot(2, 2, 2)
plt.hist(gray.ravel(), 256, [0, 256])
plt.title('Original Histogram')
plt.subplot(2, 2, 3)
plt.imshow(equ, cmap='gray')
plt.title('Equalized Image')
plt.subplot(2, 2, 4)
plt.hist(equ.ravel(), 256, [0, 256])
plt.title('Equalized Histogram')
plt.show()
```
2. 直方图规定化
直方图规定化可以将一张图像的灰度值分布映射到另一张图像的灰度值分布上,从而使两张图像具有相似的灰度分布。具体步骤如下:
1. 读取两张图像,将它们转换为灰度图像;
2. 计算两张灰度图像的直方图;
3. 计算两张灰度图像的累积分布函数(CDF);
4. 将第一张灰度图像中每个像素值的CDF线性映射到第二张灰度图像的CDF上,得到新的灰度值;
5. 将第一张灰度图像中每个像素的灰度值映射到新的灰度值,得到规定化后的图像。
在Python中,可以使用OpenCV库的cv2.calcHist()函数和numpy库的numpy.cumsum()函数实现直方图规定化。示例代码如下:
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取两张图像
img1 = cv2.imread('lena.jpg')
img2 = cv2.imread('baboon.jpg')
# 将两张图像转换为灰度图像
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# 计算两张灰度图像的直方图和累积分布函数
hist1, bins1 = np.histogram(gray1.flatten(), 256, [0, 256])
hist2, bins2 = np.histogram(gray2.flatten(), 256, [0, 256])
cdf1 = hist1.cumsum()
cdf2 = hist2.cumsum()
# 将第一张灰度图像的CDF线性映射到第二张灰度图像的CDF上,得到新的灰度值
transfer_func = np.interp(cdf1, cdf2, np.arange(256))
# 将第一张灰度图像中每个像素的灰度值映射到新的灰度值,得到规定化后的图像
result = np.interp(gray1.flatten(), np.arange(256), transfer_func)
result = result.reshape(gray1.shape).astype(np.uint8)
# 显示规定化前后的图像
plt.subplot(1, 2, 1)
plt.imshow(gray1, cmap='gray')
plt.title('Original Image')
plt.subplot(1, 2, 2)
plt.imshow(result, cmap='gray')
plt.title('Specified Image')
plt.show()
```
以上就是图像直方图的基本概念、显示方法以及直方图均衡和直方图规定化的实现方法。
阅读全文