直方图均衡化

1. 图像直方图

图像直方图,是指对整个图像在灰度范围内的像素值(0-255)统计出现频率次数,据此生成的直方图,称为图像直方图或直方图。直方图反映了图像灰度的分布情况,是图像的统计学特征。也可以说,直方图是图像中像素强度分布的图形表达方式,它统计了每一个强度值所具有的像素个数。

2. 直方图均衡化

直方图均衡化是以累计分布函数为核心,将原始图像灰度直方图从比较集中的某个灰度区间,非线性地映射为在全部灰度范围内的较均匀分布,从而增强对比度。

直方图均衡化的数学原理如下:
首先作原始图像灰度的概率直方图, 然后设输入像素灰度值为rk,累计分布函数为

在这里插入图片描述

其中ni为图像中灰度值为ri的像素频数,n为图像像素总数。设输出像素灰度值为sk,像素范围为smin-smax。期望输出灰度直方图是均匀分布,即

在这里插入图片描述

令C(sk)=C(rk),即得

在这里插入图片描述

所以最终直方图均衡化的点算子为

在这里插入图片描述

3. 直方图均衡化的Python实现

根据直方图均衡化的数学原理,用Python实现代码如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 计算累计分布函数
def C(rk):
    # 读取图片灰度直方图
    # bins为直方图直方柱的取值向量,hist为bins各取值区间上的频数取值
    hist, bins = np.histogram(rk, 256, [0, 256])
    # 计算累计分布函数
    return hist.cumsum()

# 计算灰度均衡化映射
def T(rk):
    cdf = C(rk)
    # 均衡化
    cdf = (cdf - cdf.min()) * (255 - 0) / (cdf.max() - cdf.min()) + 0
    #cdf = 255.0 * cdf / cdf[-1]
    return cdf.astype('uint8')

# 读取图片
img = cv.imread('lenna.jpg', 0)
# 将二维数字图像矩阵转变为一维向量
rk = img.flatten()
# 原始图像灰度直方图
plt.hist(rk, 256, [0, 255], color = 'r')
# 直方图均衡化
imgDst = T(rk)[img]     
plt.hist(imgDst.flatten(), 256, [0, 255], color = 'b')
plt.legend(['Before Equalization','Equalization']) 
plt.show()
# 展示前后对比图像
plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('Original Gray')
plt.subplot(122), plt.imshow(imgDst, cmap='gray'), plt.title('Histogram Equalization')
plt.show()

均衡前后图像灰度直方图如下所示:

在这里插入图片描述

直方图均衡化前后的图像对比如下所示:

在这里插入图片描述

4. opencv-python中直方图均衡化的应用

opencv-python中使用cv.equalizeHist函数即可实现直方图均衡化,其函数原型如下:

dst=cv.equalizeHist(src[, dst])

注意:输入需是灰度图像。

测试代码如下:

img = cv.imread('lenna.jpg', 0)
dst = cv.equalizeHist(img)
plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('Original Gray'), plt.axis('off')
plt.subplot(122), plt.imshow(dst, cmap='gray'), plt.title('Histogram Equalization'), plt.axis('off')
plt.show()

效果如下:
在这里插入图片描述


5. 源码仓库地址

🌼图像处理、机器学习的常用算法汇总

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值