均衡化图像过亮或者过暗的问题,比较简单的一个实验
import math
import cv2
import matplotlib.pyplot as plt
import numpy as np
road = '.\\data\\' # 数据读取路径
wroad = '.\\ans\\' # 结果保存路径
picname = 'Couple.bmp' # 图像名称
# picname = 'NBA.bmp'
pic = cv2.imread(road + picname) # 读取目标影像
data = pic.astype(np.int32) # 转换数据类型便于后面计算处理
# 虽然读入的影像是三层结构,但是三层数据的值是完全相同的,因此只需要取任意一层进行处理即可
data = data[:, :, 0]
order = 8 # 定义量级,此处灰度值为0-255因此定量级为8
l = int(math.pow(2, order)) # 得到灰度值范围
pos = np.zeros([l]) # 定义一个矩阵统计各灰度值出现的次数
for i in range(data.shape[0]):
for j in range(data.shape[1]):
pos[int(data[i, j])] += 1
pos = pos / (data.shape[0] * data.shape[1]) # 将出现次数转换为出现频率
mid = np.zeros([l]) # 定义一个矩阵统计均衡化灰度值
pos1 = np.zeros([l]) # 定义一个矩阵统计均衡化后灰度频率
sta = 0 # 定义一个中间变量方便统计累计概率
for i in range(l):
sta = pos[i] + sta
mid[i] = math.floor(sta * (l - 1))
pos1[int(mid[i])] += pos[i]
# 将统计结果用直方图展示出来
fig = plt.figure()
matrix = [i for i in range(l)] # 定义横轴坐标范围
matrix = np.array(matrix) # 转换为数组格式
ax1 = fig.add_subplot(121)
plt.bar(matrix, pos) # 直方图绘制
plt.xlabel('Gray Value') # X轴名称
plt.ylabel('Frequency') # Y轴名称
plt.title('Histogram of Normal Picture') # 图像名称
plt.grid(True) # 显示图像中网格
ax2 = fig.add_subplot(122)
plt.bar(matrix, pos1)
plt.xlabel('Gray Value')
plt.ylabel('Frequency')
plt.title('Histogram of Balance Picture')
plt.grid(True)
plt.show()
# 将原始影像的灰度值进行均衡化处理
ans = data.copy()
for i in range(data.shape[0]):
for j in range(data.shape[1]):
ans[i, j] = mid[int(data[i, j])]
anspic = np.zeros([data.shape[0], data.shape[1], 3]) # 初始化结果影像矩阵
for i in range(3):
anspic[:, :, i] = ans
anspic = anspic.astype(np.uint8) # 转换数据类型方便展示与保存
cv2.imshow('normal picture', pic) # 展示原始影像
cv2.imshow('balance picture', anspic) # 展示均衡化处理后影像
cv2.waitKey(0)
cv2.imwrite(wroad + picname + '_anspic.jpg', anspic) # 保存均衡化处理后影像