自己用python代码编写函数实现灰度直方图统计以及灰度直方图均衡化,并绘制灰度直方图及均衡化后的灰度直方图,显示初始图像及均衡化后的图像
时间: 2024-03-27 15:38:27 浏览: 62
python 对一幅灰度图像进行直方图均衡化
好的,以下是Python代码实现:
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 灰度直方图统计
def calcGrayHist(image):
# 计算图像的灰度直方图
rows, cols = image.shape
grayHist = np.zeros([256], np.uint64)
for r in range(rows):
for c in range(cols):
grayHist[image[r][c]] += 1
return grayHist
# 灰度直方图均衡化
def equalizeHist(image):
# 获取灰度直方图
grayHist = calcGrayHist(image)
# 计算累计灰度直方图
zeroCumuMoment = np.zeros([256], np.uint64)
for p in range(len(grayHist)):
if p == 0:
zeroCumuMoment[p] = grayHist[0]
else:
zeroCumuMoment[p] = zeroCumuMoment[p-1] + grayHist[p]
# 计算映射表
pixelNum = image.shape[0] * image.shape[1]
zeroCumuMoment = np.round(zeroCumuMoment / pixelNum * 255)
histEqImage = np.zeros(image.shape, np.uint8)
for r in range(image.shape[0]):
for c in range(image.shape[1]):
histEqImage[r][c] = zeroCumuMoment[image[r][c]]
return histEqImage
# 读取图像
image = cv2.imread('test.png', 0)
# 统计灰度直方图
grayHist = calcGrayHist(image)
# 绘制灰度直方图
plt.figure()
plt.bar(range(256), grayHist, width=1.0, edgecolor='none')
plt.title('Gray Histogram')
plt.xlabel('Gray Level')
plt.ylabel('Pixel Number')
plt.show()
# 灰度直方图均衡化
histEqImage = equalizeHist(image)
# 统计均衡化后的灰度直方图
histEq = calcGrayHist(histEqImage)
# 绘制均衡化后的灰度直方图
plt.figure()
plt.bar(range(256), histEq, width=1.0, edgecolor='none')
plt.title('Equalized Histogram')
plt.xlabel('Gray Level')
plt.ylabel('Pixel Number')
plt.show()
# 显示初始图像
cv2.imshow('Original Image', image)
# 显示均衡化后的图像
cv2.imshow('Histogram Equalization Image', histEqImage)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,`calcGrayHist` 函数用于计算图像的灰度直方图,`equalizeHist` 函数用于实现灰度直方图均衡化。代码中还包括绘制灰度直方图和均衡化后的灰度直方图的函数,以及显示初始图像和均衡化后的图像的相关代码。
阅读全文