MATLAB–数字图像处理 图像直方图均衡化

MATLAB–数字图像处理 图像直方图均衡化图像直方图均衡化首先 我们要理解什么是图像直方图均衡化 把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布 直方图均衡化就是对图像进行非线性拉伸 重新分配图像像素值 使一定灰度范围内的像素数量大致相同 直方图均衡化就是把给定图像的直方图分布改变成 均匀 分布直方图分布 具体见下图 说的简单点 就是把原来的图像的灰度分配均匀 使得 0 255 都有一定的取值 这样对比度相对

图像直方图均衡化

首先,我们要理解什么是图像直方图均衡化:

把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布,具体见下图(说的简单点,就是把原来的图像的灰度分配均匀,使得0-255都有一定的取值,这样对比度相对大一些,视觉上更好看一点):在这里插入图片描述
这里我们可以直接利用histeq()、adapthisteq()函数对图像进行均衡化

 H= imread('a1.jpg'); if length(size(H))>2 H=rgb2gray(H); end subplot(3,2,1); imshow(H); title('原图'); subplot(3,2,2); imhist(H); title('原图直方图'); subplot(3,2,3); H1=adapthisteq(H); imshow(H1); title('adapthisteq均衡后图'); subplot(3,2,4); imhist(H1);title('adapthisteq均衡后直方图'); subplot(3,2,5); H2=histeq(H); imshow(H2); title('histeq均衡后图'); subplot(3,2,6); imhist(H1); title('histeq均衡后直方图'); 
H= imread('a1.jpg'); %判断是否为三通道彩色图片 若是 则将其灰度化 if length(size(H))>2 H=rgb2gray(H); end %获取图片的尺寸 便于计算总像素数 即m*n [m,n]=size(H); %生成一个一行256列的矩阵 p=zeros(1,256); % 统计各灰度的像素个数 %find(H==i) 是在图像矩阵里面寻找灰度为i的点坐标 % 因为矩阵是从1开始的 所以为p(i+1) for i=0:255 p(i+1)=length(find(H==i))/(m*n); end subplot(2,2,1); 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 %对s中的数先乘以255,再取整 a=round(s*255); b=H; %更新原图像的灰度 for i=0:255 b(find(H==i))=a(i+1); end subplot(2,2,3); imshow(b) title('均衡化后图像'); %统计更新后的概率 for i=0:255 GPeq(i+1)=sum(p(find(a==i))); end subplot(2,2,4); bar(0:255,GPeq,'b'); title('均衡化后的直方图'); 

方法二(从大佬那里copy的)

Img= imread('a1.jpg'); if length(size(Img))>2 Img=rgb2gray(Img); end %绘制原始图像的直方图 [height,width]=size(Img); [counts1, x] = imhist(Img,256); counts2 = counts1/height/width; figure(1), subplot(1,2,1), imshow(Img);title('原始图像'); subplot(1,2,2), stem(x, counts2); title('原始图像直方图'); %统计每个灰度的像素值累计数目 NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级 for i = 1:height for j = 1: width %对应灰度值像素点数量+1 %NumPixel的下标是从1开始,而图像像素的取值范围是0~255,所以用NumPixel(Img(i,j) + 1) NumPixel(Img(i,j) + 1) = NumPixel(Img(i,j) + 1) + 1; end end %将频数值算为频率 ProbPixel = zeros(1,256); for i = 1:256 ProbPixel(i) = NumPixel(i) / (height * width * 1.0); end %函数cumsum来计算cdf,并将频率(取值范围是0.0~1.0)映射到0~255的无符号整数 CumuPixel = cumsum(ProbPixel); CumuPixel = uint8(255 .* CumuPixel + 0.5); %直方图均衡。赋值语句右端,Img(i,j)被用来作为CumuPixel的索引 for i = 1:height for j = 1: width Img(i,j) = CumuPixel(Img(i,j)+1); end end %显示更新后的直方图 figure(2), subplot(1,2,1), imshow(Img); title('直方图均衡化图像'); [counts1, x] = imhist(Img,256); counts2 = counts1/height/width; subplot(1,2,2), stem(x, counts2); title('直方图均衡化后图像的直方图'); 
Img= imread('a1.jpg'); OutImg=Img; %分别提取三通道的信息 R = Img(:,:,1); G = Img(:,:,2); B = Img(:,:,3); %分别对三通道的图片进行均衡化 R = histeq(R, 256); G = histeq(G, 256); B = histeq(B, 256); %最后合成为一张图片 OutImg(:,:,1) = R; OutImg(:,:,2) = G; OutImg(:,:,3) = B; figure, subplot(1,2,1), imshow(Img);title('原始图像'); subplot(1,2,2), imshow(OutImg); title('均衡化后结果'); 
mg= imread('a1.jpg'); hsvImg = rgb2hsv(Img); V=hsvImg(:,:,3); [height,width]=size(V); V = uint8(V*255); NumPixel = zeros(1,256); for i = 1:height for j = 1: width NumPixel(V(i,j) + 1) = NumPixel(V(i,j) + 1) + 1; end end ProbPixel = zeros(1,256); for i = 1:256 ProbPixel(i) = NumPixel(i) / (height * width * 1.0); end CumuPixel = cumsum(ProbPixel); CumuPixel = uint8(255 .* CumuPixel + 0.5); for i = 1:height for j = 1: width V(i,j) = CumuPixel(V(i,j)+1); %注意,这里需要+1,要不然会出问题 end end V = im2double(V); hsvImg(:,:,3) = V; outputImg = hsv2rgb(hsvImg); figure, subplot(1,2,1), imshow(Img);title('原始图像'); subplot(1,2,2), imshow(outputImg); title('在HSV空间均衡化后结果'); 

更多

获取更多资料、代码,微信公众号:海轰Pro
回复 海轰 即可

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2026年3月26日 下午5:46
下一篇 2026年3月26日 下午5:47


相关推荐

  • AFL 生态圈

    AFL 生态圈AFL 生态圈在本文中 我们将讨论的不是经典 AFL 本身 而是关于为其设计的实用程序及其修改 我们认为 这些实用程序可以显着提高模糊测试的质量 如果你想知道如何提高 AFL 以及如何更快地找到更多漏洞 继续阅读 什么是 AFL 它有什么用 AFL 是一种覆盖引导或基于反馈的模糊器 关于这些概念的更多信息可以在一篇很酷的论文 Fuzzing Art Science andEnginee

    2026年3月18日
    2
  • 一文读懂自动驾驶中常用的定位算法之NDT点云配准算法

    一文读懂自动驾驶中常用的定位算法之NDT点云配准算法本系列博客计划写两篇 第一篇侧重原生态论文重点内容翻译解释及公式推导 第二篇侧重实际代码细节 将会不定期更新 文中所用图片如无声明来源网络和论文 文章目录写在前面 AbstractChap 1Contributio 1rotation2 2registratio 3sampling2 4sla

    2026年3月17日
    2
  • 无尽的忙碌换来幸福的日子「建议收藏」

    人总是忙碌的,从小要读书,长大了工作,结婚了,有孩子了,一辈子也可能等到孩子成家了才能稍微休息一下下吧,不过有时候想想,忙碌点好,一辈子也就那么长,等闭了后还能休息好久好久呢,何不忙碌点呢。从过年以后,一直忙碌着,忙撒呢,上班忙新网站改版,下班忙结婚,周末也忙结婚,几乎一天都没有消停过,老婆无数次问我累不累,我说不累,再累也觉得幸福,嘿嘿。感叹了一下,好久也没来了,最近工作上呢刚赶出来一个…

    2022年4月13日
    34
  • 给自己的XTC820摆拍一下。[通俗易懂]

    给自己的XTC820摆拍一下。[通俗易懂]上个月入手了捷安特的XTC820,始终没有时间为爱车拍几张照,今天凑着在办公室的机会,就随手拍了几张,展示一下XTC820。先给大家看图片,然后再分享一下当初我买它的原因以及车的规格。下面就来简单说一下我为什么选择这个XTC系列?主要是考虑路面问题,目前上海的道路坑坑洼洼,铺装路面的自行车不太适合,…

    2025年8月24日
    5
  • pandas fillna详解

    pandas fillna详解pandas中补全nan具体的参数Series.fillna(self,value=None,method=None,axis=None,inplace=False,limit=None,downcast=None,**kwargs)[source]参数: value:scalar,dict,Series,orDataFrameValuetouset…

    2022年8月12日
    16
  • Android开发笔记(序)写在前面的目录[通俗易懂]

    知识点分类一方面写写自己走过的弯路掉进去的坑,避免以后再犯;另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平。因此博主就想,入门的东西咱就不写了,人不能老停留在入门上;其次是想拾缺补漏,写写虽然小众却又用得着的东西;另外就是想以实用为主,不求大而全,但求小而精;还有就是有的知识点是java的,只是Android开发也会经常遇上,所以蛮记下来。个人的经验…

    2022年4月14日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号