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

该实验通过Python实现图像的均衡化处理,解决图像过亮或过暗问题。代码读取图像,计算灰度值分布,进行直方图均衡化,然后绘制原始图像与均衡化后的灰度直方图进行对比。最后展示均衡化处理后的图像并保存结果。实验结果展示了均衡化处理的有效性。
摘要由CSDN通过智能技术生成

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

实验数据:
在这里插入图片描述
在这里插入图片描述
实验代码:

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

实验结果展示:
会保存均衡化处理过后的影像,并且会绘制两幅影像的灰度直方图进行比较,随便取一个实验数据作为例子:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值