matlab写的一个直方图规定化中的单映射程序,大家可以借鉴下
clc;
clear;
I=imread('e:\2.bmp');
figure,subplot(321),imshow(I);
title(‘原始图picture1’);
New=I;
L=256; %灰度值
[m1 n1]=size(I); %计算图像数据矩阵的行列数
Hi=zeros(L,1); % 存储源图像直方图数据
for i = 1:m1
for j = 1:n1
Hi(I(i,j)+1)=Hi(I(i,j)+1)+1; %获取像素灰度级
end
end
% 计算直方图概率统计
Pi=zeros(L,1);% 存储原图像直方图概率数据
for k=1:L
Pi(k)=Hi(k)/(m1*n1);
end
subplot(323),plot(Pi);
title('原始图直方图Pi');
% 计算累积直方图
RHi=zeros(L,1);% 存储原图像累积直方图数据
RHi(1)=Pi(1);
for k=2:L
RHi(k)=RHi(k-1)+Pi(k);
end
%subplot(325),plot(RHi);
%title('原图累积直方图RHi');
% 匹配图
J=imread('e:\1012.bmp');
subplot(322),imshow(J);
title('匹配图');
[m2 n2]=size(J);
Hj=zeros(L,10); % 存储匹配图直方图数据
for i = 1:m2
for j = 1:n2
Hj(J(i,j)+1)=Hj(J(i,j)+1)+1; % 获取匹配图像素灰度级
end
end
% 计算直方图概率统计
Pj=zeros(L,1);% 存储匹配图直方图概率数据
for k=1:L
Pj(k)=Hj(k)/(m1*n1);
end
subplot(324),plot(Pj);
title('匹配图的直方图Pj');
% 计算累积直方图
RHj=zeros(L,1);% 存储匹配累积直方图数据
RHj(1)=Pj(1);
for k=2:L
RHj(k)=RHj(k-1)+Pj(k);
end
%subplot(326),plot(RH2);
%title('匹配图累积直方图RH2');
% 计算原图像与匹配图像累积直方图数值的差的绝对值
double ScMin=zeros(256,256);
for y=1:L
for x=1:L
ScMin(x,y)=abs(RHi(y)-RHj(x));
end
end
% 建立SML单映射
HisM=zeros(L:1);
for k=1:L
min = 0;
minV=ScMin(1,k);
for t=1:L
if(minV>ScMin(t,k))
minV=ScMin(t,k);
min = t-1;
end
end
HisM(k)= min;
end
% 将原图的每个像素灰度转换为映射对应的灰度
for x = 1:m1
for y = 1:n1
Num = double( I(x,y))+1;
if Num==i
New(x,y)=HisM(i);
end
end
end
subplot(325),imshow(New),title('匹配后图像');
% 计算直方图匹配后的直方图
Hd=zeros(L,10); % 存储匹配后直方图数据
for i = 1:m2
for j = 1:n2
Hd(New(i,j)+1)=Hd(New(i,j)+1)+1; % 获取像素灰度级
end
end
% 计算直方图概率统计
Pd=zeros(L,1);% 存储匹配后直方图概率数据
for k=1:L
Pd(k)=Hd(k)/(m1*n1);
end
subplot(326),plot(Pd),title('匹配后直方图');
|