前些天数字图像处理课上老师留了一个作业,要求自选一副图像对其做直方图均衡化处理,然后对图像进行灰度变换,使变换后的图像大致具有下图所示归一化直方图的趋势,并绘制直方图。
histeq 是MATLAB里面直方图均衡化的函数,这里我们不用它手动实现直方图均衡化,以加深对图像直方图均衡化操作的理解。我们还是先使用histeq来写一下直方图均衡化的程序,然后跑一下看看结果:
I = imread('C:\Users\Administrator\Desktop\静静.jpg');
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