图像处理——直方图均衡化

该代码实现了使用Python和OpenCV进行空间域图像增强,特别是直方图均衡化的方法。首先,从给定的PNG图像中读取并转换为灰度图,然后计算灰度值的概率分布,接着进行直方图均衡化计算新的灰度值,并用此创建查找表(LUT)。最后,展示原图和增强后的图像以及它们的直方图。
摘要由CSDN通过智能技术生成

实现目标:

实现空间域图像增强方法中的直方图均衡化方法。


代码如下:

"""
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()

实现效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值