1. 直方图的规范化。处理图像:2.bmp。
1) 单映射规则(single mapping law,SML)
2) 组映射规则(group mapping law,GML)
3) 比较SML和GML的误差大小。
规定化函数 y=x
源程序:(参考原理自己写 有两幅图没输出来)
function[]=H_Matching()
clear;
close all;
I=imread('2.bmp');
diff=zeros(256,256);
diff=double(diff);
HistogramSML=zeros(256);
%HistogramSML=double(HistogramSML);
HistogramGML=zeros(256);
%HistogramGML=double(HistogramGML);
scr=zeros(256);
%scr=double(scr);
dest=zeros(256);
%dest=double(dest);
for k=1:256
scr(k+1)=length(find(I==k));
end
scrpro=scr/sum(scr);
for i=2:256
scrpro(i)=scrpro(i-1)+scrpro(i);
end
for i=1:256
dest(i)=i;
end
destpro=dest/sum(dest);
for i=2:256
destpro(i)=destpro(i-1)+destpro(i);
end
for j=1:256
for i=1:256
diff(i,j)=destpro(i)-scrpro(j);
if diff(i,j)<0
diff(i,j)=-diff(i,j);
end
end
end
%SML
for j=1:256
minx=0;
minvalue=diff(1,j);
for i=2:256
if minvalue>diff(i,j)
minvalue=diff(i,j);
minx=i;
end
end
HistogramSML(j)=minx;
end
%SML规定化后直方图
SH=zeros(256);
SH=double(SH);
for i=1:256
SH(HistogramSML(i)+1)=SH(HistogramSML(i)+1)+scr(i);
end
%规定化后概率直方图
SHpro=SH/sum(SH);
subplot(2,3,2);
plot(SHpro);
title('SML映射后的概率直方图');
xlabel('灰度值');
ylabel('概率密度');
%GML
lastStartY=1;
lastEndY=1;
startY=1;
endY=1;
for i=1:256
minvalue=diff(i,1);
for j=2:256
if minvalue>diff(i,j)
minvalue=diff(i,j);
endY=j;
end
end
if (startY~= lastStartY) || (endY~=lastEndY)
for k=startY:endY
HistogramGML(k)=i;
end
lastStartY=startY;
lastEndY=endY;
startY=lastEndY+1;
end
end
%GML规定化后直方图
GH=zeros(256);
GH=double(GH);
for i=1:256
GH(HistogramGML(i)+1)=GH(HistogramGML(i)+1)+scr(i);
end
%规定化后概率直方图
GHpro=GH/sum(GH);
subplot(2,3,3);
plot(GHpro);
title('GML映射后的概率直方图');
xlabel('灰度值');
ylabel('概率密度');
S=zeros(256,256);
%S=double(S);
G=zeros(256,256);
%G=double(G);
subplot(2,3,4);
imshow(I);
subplot(2,4,1);
K=rgb2gray(I);
imhist(K);
title('origin');
for i=1:256
for j=1:256
S(i,j)=HistogramSML(I(i,j)+1);
end
end
subplot(2,3,5);
imshow(S);
title('SML');
for i=1:256
for j=1:256
G(i,j)=HistogramGML(I(i,j)+1);
end
end
subplot(2,3,6);
imshow(G);
title('GML');
运行结果:
标准结果: