图像增强之直方图均衡化(不用histeq)与直方图规定化

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/79819263



猜你喜欢

转载自blog.csdn.net/macunshi/article/details/79804547