数字图像处理——直方图均衡化(Python)

均衡化图像过亮或者过暗的问题,比较简单的一个实验

实验数据:
数字图像处理——直方图均衡化(Python)_第1张图片
数字图像处理——直方图均衡化(Python)_第2张图片
实验代码:

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)  # 保存均衡化处理后影像

实验结果展示:
会保存均衡化处理过后的影像,并且会绘制两幅影像的灰度直方图进行比较,随便取一个实验数据作为例子:
数字图像处理——直方图均衡化(Python)_第3张图片
数字图像处理——直方图均衡化(Python)_第4张图片

你可能感兴趣的:(python,图像处理)