本文主要是介绍数字图像处理之二直方图规定化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
clear;close all;
I=imread('D:/567.png');
dif=zeros(256,256);%%变量的定义及其初始化
dif=double(dif);
H_SML=zeros(256);%单映射变量定义初始化
H_GML=zeros(256);%组映射变量定义初始化
src=zeros(256);%源图像像素分为256个等级
dst=zeros(256);%处理后的图像像素等级256个
for k=1:256
src(k+1)=length(find(I==k)); %在这里计算每个分量bin的值
end
src_pro=src/sum(src);%%进行归一化处理
for i=2:256
src_pro(i)=src_pro(i-1)+src_pro(i);%%计算累计直方图
end
for i=1:256
dst(i)=i;
end
dst_pro=dst/sum(dst);
for i=2:256
dst_pro(i)=dst_pro(i-1)+dst_pro(i);%%这里已经计算出了规定后的累积直方图。
end
for j=1:256
for i=1:256
dif(i,j)=dst_pro(i)-src_pro(j);
if dif(i,j)<0
dif(i,j)=-dif(i,j);
end
end
end
%SML单映射
for j=1:256
minx=0;
minvalue=dif(1,j);
for i=2:256
if minvalue>dif(i,j)
minvalue=dif(i,j);
minx=i;
end
end
H_SML(j)=minx;
end
%SML规定化后直方图
SH=zeros(256);
SH=double(SH);
for i=1:256
SH(H_SML(i)+1)=SH(H_SML(i)+1)+src(i);
end
%规定化后概率直方图
SHpro=SH/sum(SH);
subplot(2,3,2);
plot(SHpro);
axis([0,257,0,0.05]);
title('单映射后的概率直方图');
xlabel('灰度值');
ylabel('概率密度');
%GML
lastStartY=1;
lastEndY=1;
startY=1;
endY=1;
for i=1:256
minvalue=dif(i,1);
for j=2:256
if minvalue>dif(i,j)
minvalue=dif(i,j);
endY=j;
end
end
if (startY~= lastStartY) || (endY~=lastEndY)
for k=startY:endY
H_GML(k)=i;
end
lastStartY=startY;
lastEndY=endY;
startY=lastEndY+1;
end
end
%GML组映射规定化后直方图
GH=zeros(256);
GH=double(GH);
for i=1:256
GH(H_GML(i)+1)=GH(H_GML(i)+1)+src(i);
end
%规定化后概率直方图
GHpro=GH/sum(GH);
%gh=uint8(GH);
subplot(2,3,3);
plot(GHpro);
axis([0,257,0,0.05]);%这里是设置坐标轴的显示范围。
title('组映射后的概率直方图');
xlabel('灰度值');
ylabel('概率密度');
S=zeros(256,256);
S=uint8(S);%这里要转换为uint8类型的用于显示
G=zeros(256,256);
G=uint8(G);%这里也要对器进行转换转换为uint8类型的
subplot(2,3,4);
imshow(I);
subplot(2,4,1);
KK=rgb2gray(I);
imhist(KK);
title('源图像');
for i=1:241
for j=1:357
S(i,j)=H_SML(I(i,j)+1);
end
end
subplot(2,3,5);
imshow(S);
title('单映射后的图像');
for i=1:241
for j=1:357
G(i,j)=H_GML(I(i,j)+1);
end
end
subplot(2,3,6);
imshow(G);
title('组映射后的图像');
figure(3)
plot(GH);
title('组映射的直方图');
xlabel('灰度值');
ylabel('像素数');
figure(4)
plot(SH,'Color',[0 0.03 1]);
title('单映射的直方图');
xlabel('灰度值');
ylabel('像素数');
这篇关于数字图像处理之二直方图规定化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!