% 数字图像处理程序作业
% 本程序能将JPG格式的彩色图像文件灰度化并进行 直方图均衡
%
% 输入文件:PicSample.jpg 待处理图像
% 输出文件:PicSampleGray.bmp 灰度化后图像
% PicEqual.bmp 均衡化后图像
%
% 输出图形窗口说明
% figure NO 1 待处理彩色图像
% figure NO 2 灰度化后图像
% figure NO 3 直方图
% figure NO 4 均衡化后直方图
% figure NO 5 灰度变化曲线
% figure NO 6 均衡化后图像
% 1, 处理的图片名字要为 PicSample.jpg
% 2, 程序每次运行时会先清空workspace
clear all
%一,图像的预处理,读入彩色图像将其灰度化
PS=imread('PicSample12.jpg'); %读 入JPG彩色图像文件
imshow(PS) %显 示出来 figureNO 1
title('输入的彩色JPG图像')
imwrite(rgb2gray(PS),'PicSampleGray.bmp'); %将 彩色图片灰度化并保存
PS=rgb2gray(PS); %灰度化后的数据存入数组
figure,imshow(PS) %显 示灰度化后的图像,也是均衡化前的样品 figure NO 2
title('灰度化后的图像')
%二,绘制直方图
[m,n]=size(PS); %测 量图像尺寸参数
GP=zeros(1,256); %预 创建存放灰度出现概率的向量
for k=0:255
GP(k+1)=length(find(PS==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置
end %find(PS==K) 就是将PS这组数据中等于K的值的坐标进行存储
figure,bar(0:255,GP,'g') %绘 制直方图 figure NO 3
title('原图像直方图')
xlabel('灰度值')
ylabel('出现概率')
%三,直方图均衡化
S1=zeros(1,256);
for i=1:256
for j=1:i
S1(i)=GP(j)+S1(i); %计算Sk
end
end
S2=round(S1*256); %将Sk归到相近级的灰度
%四,图像均衡化
PA=PS; %将图像数据传给PA
for i=0:255
PA(find(PS==i))=S2(i+1); %将各个像素归一化后的灰度值赋给 这个像素
end
figure,imshow(PA) %显 示均衡化后的图像 figure NO 6
title('均衡化后图像')
imwrite(PA,'PicEqual.bmp');
% for i=1:256
% GPeq(i)=sum(GP(find(S2==i))); %计算现有每个灰度级出现的概率
% end
%绘制直方图均衡化后的图像的直方图
GPeq=zeros(1,256);
for i=1:256
t=find(S2==i); %统计各灰度级出现的个数
GPeq(i)=sum(GP(t)); %计算现有每个灰度级出现的概率
end
figure,bar(0:255,GPeq,'b') %显示均衡化后的直方图 figure NO 4
title('均衡化后的直方图')
xlabel('灰度值')
ylabel('出现概率')
figure,plot(0:255,S2,'r') %显示灰度变化曲线 figure NO 5
legend('灰度变化曲线')
xlabel('原图像灰度级')
ylabel('均衡化后灰度级')
%灰度级间隔分布均匀化
PB=PA;
t=length(find(GPeq)); %处理后的实际的灰度级数
l=255/t; %灰度级增长步长
Mk=zeros(1,256); %建立一个新映射图的向量表
Mk(1)=1; %第一个像素初始化为1
%以下的步骤是将统计后的直方图分布灰度级之间均衡化
for i=2:256
if(GPeq(i)~=0)
Mk(i)=Mk(i-1)+1;
else
Mk(i)=Mk(i-1);
end
end
for i=2:256
Mk(i)=round(Mk(i)*l);
end
figure,plot(0:255,Mk,'r') %显示灰度间隔均匀化的灰度变化曲线 figure NO 4
title('灰度级间隔均匀化的灰度变化曲线')
xlabel('原图像灰度级')
ylabel('均衡化后灰度级')
PB=PA;
for i=0:255
PB(find(PA==i))=Mk(i+1); %将各个像素归一化后的灰度值赋给 这个像素
end
figure,imshow(PB) %显 示均衡化后的图像 figure NO 6
title('双均衡化后图像')
imwrite(PB,'PicEqual.bmp');
%绘制灰度级均衡化后的图像的直方图
[m,n]=size(PB); %测 量图像尺寸参数
GP2=zeros(1,256); %预 创建存放灰度出现概率的向量
for k=0:255
GP2(k+1)=length(find(PB==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置
end %find(PS==K) 就是将PS这组数据中等于K的值的坐标进行存储
figure,bar(0:255,GP2,'g') %绘 制直方图 figure NO 3
title('双均衡化后的直方图')
xlabel('灰度值')
ylabel('出现概率')
评论0