实现目标:
实现空间域图像增强方法中的直方图均衡化方法。
代码如下:
"""
Created on 2023/3/21 10:32
@author: liuwenq
实验一_空间域图像增强方法_直方图均衡化
"""
import cv2
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
# 获取图像并转化为灰度图
img = cv2.imread('E:/11.PNG')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转化为灰度图
# 直方图预处理,获得概率分布
def get_gray(img_gray):
h = img_gray.shape[0] # 读取像素矩阵长度
w = img_gray.shape[1] # 读取像素矩阵宽度
gray_num = np.zeros(256) # 存储灰度值
gray_prob = np.zeros(256) # 存储灰度值概率分布Psk
for i in range(1, h - 1):
for j in range(1, w - 1):
gray_num[img_gray[i, j]] += 1 # 统计灰度值为img_gray[i,j]的个数
for i in range(1, 256):
gray_num[i] = gray_num[i] / (h * w) # 将直方图归一化
for i in range(1, 256):
gray_prob[i] = gray_prob[i - 1] + gray_num[i] # 统计概率分布
return gray_prob
# 直方图均衡化
def hist_gray(img_gary):
gray_prob = get_gray(img_gray)
lut = np.zeros(256)
for i in range(256):
lut[i] = gray_prob[i] * 255.0 # 计算新的灰度值
lut = np.uint8(lut + 0.5)
out = cv2.LUT(img_gray, lut)
return out
# 输出结果
result_img = hist_gray(img_gray)
source = cv2.calcHist([img_gray],[0],None,[256],[0,256]) # 原始灰度图的直方图
result = cv2.calcHist([result_img],[0],None,[256],[0,256]) # 均衡化后的直方图
# 显示图像
# cv2.imshow('img',imutils.resize(img,400))
plt.figure(figsize=(10, 8), dpi=200)
matplotlib.rcParams['font.sans-serif'] = ['KaiTi']
plt.suptitle("直方图均值化",fontsize=40,x=0.5,y=0.1)
plt.subplot(121)
plt.imshow(img, cmap=plt.cm.gray)
plt.title("Qrigin",fontsize=18)
plt.subplot(122)
plt.imshow(result_img, cmap=plt.cm.gray)
plt.title("Result",fontsize=18)
# 显示直方图
fig = plt.figure()
ax1 = fig.add_subplot(1,2,1)
ax1.plot(source)
ax2 = fig.add_subplot(1,2,2)
ax2.plot(result)
plt.show()
if cv2.waitKey(0)==27:
cv2.destroyAllWindows()
实现效果: