图像直方图均衡化
1. 直方图均衡化介绍
自我感觉书上讲的很清楚,直接把截图贴上了。
在进行直方图均值化的过程如下
读入图像
对每个通道分别统计像素值[0,255]出现的次数。
对每个通道分别求像素值[0,255]出现的概率,得到概率直方图。
对每个通道分别求像素值[0,255]概率的前缀和,得到累计直方图。
对每个通道根据累计直方图分别求像素映射函数。
对每个通道完成每个像素点的映射。
输出直方图均衡化的图像。
2.代码(MATLAB)
1 %直方图均衡化 2 I = imread('D:/picture/girl.jpg'); 3 I=rgb2gray(I);%如果某些图片不是二维灰度图像要加上这句,否则imhist报错 4 [height,width] = size(I); 5 figure 6 subplot (221) 7 imshow(I);%显示原始图像 8 subplot(222) 9 imhist(I)%显示原始图像直方图(注释一) 10 11 %进行像素灰度统计 12 NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级 13 for i = 1:height 14 for j = 1:width 15 NumPixel (I(i,j)+1)=NumPixel(I(i,j)+1)+1;%对应灰度值像素点数量增加一9(注释二) 16 end 17 end 18 %计算灰度分布密度 19 ProbPixel = zeros(1,256); 20 for i =1:256 21 ProbPixel(i) = NumPixel(i)/(height*width*1.0);%该灰度值的像素个数除于总的像素点的个数 22 end 23 %计算累计直方图分布 24 CumuPixel = zeros(1,256); 25 for i = 1:256; 26 if i == 1 27 CumuPixel(i) = ProbPixel(i); 28 else 29 CumuPixel(i) = CumuPixel(i-1)+ProbPixel(i);%进行累加 30 end 31 end 32 %累计分布取整 33 34 CumuPixel = uint8(256* CumuPixel);%也就是原来图像的灰度级根据累加概率的值变成了新的灰度级(注释三) 35 %对灰度值进行映射(均衡化) 36 for k =1:height 37 for l =1:width 38 I(k,l)= CumuPixel(I(k,l)+1);%映射,加一的目的是使下标从一开始 39 end 40 end 41 subplot(223) 42 imshow(I)%显示原始图像 43 subplot(224) 44 imhist(I)%显示原始图像直方图
运行结果如下
注:直方图x轴是图像的灰度值,y轴是在该灰度值的像素的个数
分析:观察图片我们发现对于原始图片整体颜色偏白,对比度不强,直方图分布偏于右边。直方化后的图片整体颜色加深,灰度增强,头发没有原来那么偏白了,直方图整体分布开始偏左且更均匀化,图片整体对比度增强。
3注释
注释一
imhist()主要用于计算图像灰度值的直方图统计;

1 i = imread('D:/picture/ZiXia.jpg'); 2 i=rgb2gray(i); 3 imshow(i); 4 figure; 5 imhist(i); 6 figure; 7 imhist(i,32); 8 figure; 9 [count,x] = imhist(i,32); 10 stem(x,count);
注释二
NumPixel(I(i,j) + 1) --------这个表示的是什么呢?---a NumPixel(I(i,j) + 1) + 1------这个表示像素点的灰度级加1---b I(i,j)-----表示(i,j)点的灰度值 a 处灰度值加1是代码中灰度值得范围的[1,256],不是[0,255] b 处为对灰度值相同的像素做统计加1,可以将NumPixel( I(i,j) + 1)看做是下标为灰度值,数组元素值为对应下标(灰度值)统计像素的个数 比如统计出来的灰度值为23的像素个数为4个,那么代码中的表现形式是:NumPixel( 22 + 1) = 4.
注释三
比如原始图像的灰度值为30的像素个数在新图像里面就变为原始图像灰度值小于等于30的像素个数之和作为新图像像素值为30的像素个数。依次类推。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!