histeq 是MATLAB里面直方图均衡化的函数,这里我们不用它手动实现直方图均衡化,以加深对图像直方图均衡化操作的理解。


前些天数字图像处理课上老师留了一个作业,要求自选一副图像对其做直方图均衡化处理,然后对图像进行灰度变换,使变换后的图像大致具有下图所示归一化直方图的趋势,并绘制直方图。



首先我们先使用histeq来写一下直方图均衡化的程序,然后跑一下看看结果:
I = imread('pout .tif'); figure(1);
subplot(211);imshow(I);subplot(212);imhist(I); [J,T] = histeq(I);
figure(2);subplot(211);imshow(J);subplot(212); imhist(J);
figure(3);plot([0:255]/255,T);
嗯,还是比较简单的嘛,看着效果也不错,这个代码大家可以自己试一下嘛。

接下来我们来完成上面的作业,代码如下:
clc clear all %预处理 I =imread('C:\Users\Administrator\Desktop\静静.jpg'); %读图
GI=rgb2gray(I); %彩色图转灰度图Grey_Image %展示原图 figure('NumberTitle', 'on', 'Name',
'原图像'); imshow(I),title('小姐姐'); %展示原灰度图及直方图 figure('NumberTitle', 'on', 'Name',
'原灰度图像'); subplot(2,1,1);imshow(GI),title('灰度图像');
subplot(2,1,2);imhist(GI),title('直方图'); %图像均衡化处理过程 [M,N]=size(GI);
GI1=reshape(GI,M*N,1); GI1_sort=sortrows(GI1);%按灰度值排序方便统计 [a, b, c] =
unique(GI1_sort);%a为不同种灰度值数组,b为不同灰度值第一次出现的索引号 %统计每个灰度值的个数,计算概率 for
i=1:size(a)-1 num(i)=b(i+1)-b(i); p(i)=num(i)/(M*N); end num(i+1)=M*N-b(i+1)+1;
p(i+1)=num(i+1)/(M*N); %计算像素映射关系 sum=0; for i=1:size(a) sum=sum+p(i); s(i)=sum;
ss(i)=floor((double(max(GI1)-min(GI1))*s(i))+0.5);
%有的均衡化理论中不是该图像最大灰度值减去最小灰度值,而是(2^n-1)-0 end %对原图进行映射 for i=1:M*N
GI_new1(i)=ss(find(a==GI1(i))) ; end GI_new=uint8(reshape(GI_new1,M,N));
%展示均衡化后的图像和直方图 figure('NumberTitle', 'on', 'Name', '均衡化处理结果')
subplot(2,1,1);imshow(GI_new),title('灰度图像');
subplot(2,1,2);imhist(GI_new),title('直方图'); %预设规定化概率密度值
%索引1-255代表像素0-254,没有计算第256是因为加上那一个概率后总概率超过1了 for i=1:128
p1(i)=-1/127^2*(i-1)+1/127; end for i=129:255 p1(i)=1/127^2*(i-2)-1/127; end
%计算像素映射关系 sum1=0; for i=1:255 sum1=sum1+p1(i); s1(i)=sum1;
ss1(i)=floor((254*s1(i))+0.5);%同上,有的均衡化理论中不是254-0=254,而是(2^8-1)-0=255 end
%将均衡图像映射到规定化图像 [a1, b1, c1] = unique(ss1);%a1为不同种灰度值数组,b1为不同灰度值第一次出现的索引号 for
i=1:M*N flag=find(a1==GI_new1(i)); %flag用于判断均衡后像素是否在规定化映射中找得到 if isempty(flag)
GI_regular1(i)=GI_new1(i); else GI_regular1(i)=b1(find(a1==GI_new1(i)))-1; end
end GI_regular=uint8(reshape(GI_regular1,M,N)); %展示规定化后的图像和直方图
figure('NumberTitle', 'on', 'Name', '规定化处理结果')
subplot(2,1,1);imshow(GI_regular),title('灰度图像');
subplot(2,1,2);imhist(GI_regular),title('直方图');
 

什么你问我静静是谁,当然是我喜欢的一个小姐姐,是个美女了,不信你们看嘛

 



然后给你们看看处理后的结果

原灰度图和直方图:



均衡化后的结果和直方图分布:



规定化后的结果和直方图分布;



嗯!效果还是蛮不错的嘛,没有小姐姐的图片我才不愿意做这作业呢。

奥,有小伙伴看不懂代码想知道计算过程,那我就后续补上。

直方图均衡化请点这儿:

https://blog.csdn.net/macunshi/article/details/79815870
<https://blog.csdn.net/macunshi/article/details/79815870>

直方图规定化请戳这儿:

https://blog.csdn.net/macunshi/article/details/79819263
<https://blog.csdn.net/macunshi/article/details/79819263>