💌 所属专栏:【数字图像处理笔记】
😀 作 者:我是夜阑的狗🐶
🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询!
💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘
您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!🤩 🤩 🤩
前言
大家好,又见面了,我是夜阑的狗🐶,本文是专栏【数字图像处理笔记】专栏的第1篇文章;
这是今天学习到数字图像处理笔记 – Matlab实现直方图均衡化 💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。
专栏地址:【数字图像处理笔记】 , 此专栏是我是夜阑的狗对数字图像处理学习过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
一、原理
直方图均匀化将原始图像的直方图变为均匀分布的形式,将一非均匀灰度概率密度分布图像,通过寻求某种灰度变换,变成一幅具有均匀概率密度分布的目的图像。
直方图均匀化主要分为七个步骤:
-
Step 1、求图像中所包含的灰度级 r k r_k rk;
-
Step 2、统计各灰度级的像素数目;
-
Step 3、计算图像直方图;
-
Step 4、计算变换函数:
S k = T ( r k ) = ∑ j = 0 k P r ( r j ) = ∑ j = 0 k n j n S_k = T(r_k) = \sum_{ \begin{subarray}{l} j=0 \end{subarray}}^kP_r(r_j)= \sum_{ \begin{subarray}{l} j=0 \end{subarray}}^k {\frac {n_j} n} Sk=T(rk)=j=0∑kPr(rj)=j=0∑knnj
其中 k 为灰度级; -
Step 5、变换函数计算映射后输出灰度级 S k S_k Sk;
-
Step 6、统计 S k S_k Sk 的像素数目 n k n_k nk;
-
Step 7、计算输出图像直方图;
二、实现过程
1、第一种(直接调用Matlab内置函数):
代码:
G=imread('Fig0111(katrina_2005_08_29_NOAA).tif');
J=histeq(G); %直方图均衡化,这一个函数就可以做到均衡化的效果
figure,
subplot(121),imshow(uint8(G));
title('原图')
subplot(122),imshow(uint8(J));
title('均衡化后')
figure,
subplot(121),imhist(G,64);
title('原图像直方图');
subplot(122),imhist(J,64);
title('均衡化后的直方图');
运行结果:

从图中可以看出,原图像在经过直方图均衡化处理后可以增强图像的局部对比度。依据上面的实验原图举例说明,原始图像绝大部分像素点分布在100-190之间的区域,相对集中造成图像不够清晰。
经过均衡化处理后,像素点分布灰度范围变大,均匀分布,对比度增强,清晰度提高,所以直方图均衡化处理对于整体偏暗或者整体偏亮的图像是一种有效的图像增强方法。
2、第二种(自己编写):
代码:
% 输入图像
H = imread('Fig0111(katrina_2005_08_29_NOAA).tif');
[m,n]=size(H); % 计算图像的长宽
p=zeros(1,256); %创建数组存储像素概率
% 统计每个像素值出现的概率, 得到概率直方图
for i=0:255
% 用length函数计算相同像素的个数
p(i+1)=length(find(H==i))/(m*n);
end
%输出原图
subplot(2,2,1); %用subploy函数将多个图像画到同一个平面中
imshow(H); %输出图像
title('原图');
%画出原图直方图
subplot(2,2,2);
bar(0:255,p,'b');
title('原图直方图');
% 求累计概率,得到累计直方图
s=zeros(1,256);
for i=1:256
for j=1:i
s(i)=p(j)+s(i);
end
end
%完成每个像素点的映射
a=round(s*255);
b=H;
for i=0:255
b(H==i)=a(i+1);
end
%输出均衡化后的图像
subplot(2,2,3);
imshow(b)
title('均衡化后图像');
for i=0:255
GPeq(i+1)=sum(p(a==i));
end
%画出均衡化后的直方图
subplot(2,2,4);
bar(0:255,GPeq,'b');
title('均衡化后的直方图');
运行结果:
从图中直方图均衡化的结果可以看出,与第一种方法的图像中调用 Matlab
函数的处理结果几基本一致,说明了通过编写的 matlab
程序是对的。
如果采用高清图像进行直方图均值化处理会产生影响,可以调用 imadjust()
函数来降低图像的对比度,然后在进行直方图均衡化处理。
总结
感谢观看,如果觉得有帮助,请给文章点个赞吧,让更多的人看到。🌹 🌹 🌹
也欢迎你,关注我。👍 👍 👍
原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!下期再见。🎉
更多专栏订阅:
- 😀 【LeetCode题解(持续更新中)】
- 🌼 【鸿蒙系统】
- 👑 【Python脚本笔记】
- 🚝 【Java Web项目构建过程】
- 💛 【微信小程序开发教程】
- ⚽ 【JavaScript随手笔记】
- 🤩 【大数据学习笔记(华为云)】
- 🦄 【程序错误解决方法(建议收藏)】
- 🚀 【软件安装教程】
订阅更多,你们将会看到更多的优质内容!!