前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >直方图均衡化的原理及实现途径_请简述图像直方图均衡的原理

直方图均衡化的原理及实现途径_请简述图像直方图均衡的原理

作者头像
全栈程序员站长
发布2022-09-27 10:54:47
3.8K0
发布2022-09-27 10:54:47
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君

直方图均衡化的原理及实现

一、直方图

1.1 直方图的概念

在图像处理中, 经常用到直方图, 如颜色直方图、 灰度直方图等。

图像的灰度直方图就描述了图像中灰度分布情况, 能够很直观的展示出图像中各个灰度级所占的多少。图像的灰度直方图是灰度级的函数, 描述的是图像中具有该灰度级的像素的个数: 其中, 横坐标是灰度级, 纵坐标是该灰度级出现的率。如下图所示

在这里插入图片描述
在这里插入图片描述

1.2 直方图的性质

① 直方图反映了图像中的灰度分布规律。 它描述每个灰度级具有的像素个数, 但不包含这些像素在图像中的位置信息。 图像直方图不关心像素所处的空间位置, 因此不受图像旋转和平移变化的影响, 可以作为图像的特征。

② 任何一幅特定的图像都有唯一的直方图与之对应, 但不同的图像可以有相同的直方图。

③如果一幅图像有两个不相连的区域组成, 并且每个区域的直方图已知, 则整幅图像的直方图是该两个区域的直方图之和。

1.3 直方图的应用

下图是四种常见的直方图的灰度分布规律

在这里插入图片描述
在这里插入图片描述

如果需要将上图中灰度偏暗、偏亮或偏集中的直方图调整为灰度均匀分布的直方图,就需要用到直方图均衡化算法。

二、直方图均衡化

2.1 直方图均衡化的概念

直方图均衡化(Histogram Equalization)是一种增强图像对比度(Image Contrast)的方法,其主要思想是将一副图像的直方图分布通过累积分布函数变成近似均匀分布,从而增强图像的对比度。为了将原图像的亮度范围进行扩展, 需要一个映射函数, 将原图像的像素值均衡映射到新直方图中, 这个映射函数有两个条件:

①不能打乱原有的像素值大小顺序, 映射后亮、 暗的大小关系不能改变;

② 映射后必须在原有的范围内,即像素映射函数的值域应在0和255之间;

综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数。

2.2 累积分布函数的数学原理

因为图像由一个个像素点组成,所以图像直方图均衡化是通过离散形式的累积分布函数求解的,直方图均衡化过程中,映射方法是:

在这里插入图片描述
在这里插入图片描述

其中,s_k指当前灰度级经过累积分布函数映射后的值,n是图像中像素的总和,n_j是当前灰度级的像素个数,L是图像中的灰度级总数。

(直方图均衡化数学原理,详细查看:> https://blog.csdn.net/superjunenaruto/article/details/52431941)

2.3 直方图均衡化的步骤

①依次扫描原始灰度图像的每一个像素, 计算出图像的灰度直方图;

②计算灰度直方图的累积分布函数;

③根据累积分布函数和直方图均衡化原理得到输入与输出之间的映射关系。

④最后根据映射关系得到结果进行图像变换

2.4 参考下面这个例子可以更直观的理解直方图均衡化的原理及过程

在这里插入图片描述
在这里插入图片描述

三、代码块及实现效果

3.1 代码块

代码语言:javascript
复制
import cv2
import numpy as np
from matplotlib import pyplot as plt

''' calcHist-计算图像直方图 函数原型:calcHist(images,channels,mask,histSize,ranges,hist=None,accumulate=None) images:图像矩阵,例如:[image] channels:通道数,例如:0 mask:掩膜,一般为:None histSize:直方图大小,一般等于灰度级数 ranges:横轴范围 '''

# 获取灰度图像
img = cv2.imread("D:\pycharm\exercise\spring festival holiday\lenna.PNG", 0)

# 灰度图像的直方图
hist = cv2.calcHist([img],[0],None,[256],[0,256])
plt.figure()#新建一个图像
plt.title("Grayscale Histogram")
plt.xlabel("Bins")#X轴标签
plt.ylabel("# of Pixels")#Y轴标签
plt.plot(hist)
plt.xlim([0,256])#设置x坐标轴范围
plt.show()


''' equalizeHist—直方图均衡化 函数原型: equalizeHist(src, dst=None) src:图像矩阵(单通道图像) dst:默认即可 '''
# 灰度图像直方图均衡化
dst = cv2.equalizeHist(img)

# 直方图
hist = cv2.calcHist([dst],[0],None,[256],[0,256])

plt.figure()
plt.hist(dst.ravel(), 256)
plt.show()

cv2.imshow("Histogram Equalization",np.hstack([img, dst]))
cv2.waitKey(0)

3.2 处理效果

源图直方图

在这里插入图片描述
在这里插入图片描述

均衡化处理后的直方图

在这里插入图片描述
在这里插入图片描述

源图与均衡化处理后的对比效果

在这里插入图片描述
在这里插入图片描述

3.3 彩色直方图均衡化代码块

代码语言:javascript
复制
# 彩色图像直方图均衡化
img = cv2.imread("lenna.png", 1)
cv2.imshow("src", img)

# 彩色图像均衡化,需要分解通道 对每一个通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一个通道
result = cv2.merge((bH, gH, rH))
cv2.imshow("dst_rgb", result)

cv2.waitKey(0)

四、参考资料:

1、直方图均衡化原理:https://www.cnblogs.com/tianyalu/p/5687782.html

2、直方图均衡化的数学原理:https://blog.csdn.net/superjunenaruto/article/details/52431941

3、直方图均衡化方面的知识和方法:https://zhuanlan.zhihu.com/p/44918476

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179232.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 直方图均衡化的原理及实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档