直方图和直方图均衡的Matlab完整程序(数字图像处理)
一、 实验目的
掌握基本的图象增强方法,观察图象增强的效果,加深对灰度直方图及直方图均衡化的理解,掌握直方图均衡化方法。
二、实验内容
将一张彩色图片转换成灰色图片,画灰度直方图和均衡化后的直方图,并将灰度图和均衡化后的图片对比。
三、实验原理
灰度直方图是将数字图像中的所有像素,按照灰度值的大小,统计其所出现的频度。通常,灰度直方图的横坐标表示灰度值,纵坐标为像素个数,也可以采用某一灰度值的像素数占全图像素数的百分比作为纵坐标。
直方图均衡方法的基本原理是:对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并。从而达到清晰图像的目的。
四、实验程序
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%函数功能,画出图像的直方图,并对图像进行直方图均衡
%直接读图像abc.jpg,读到tuu中
%graydis是原始直方图各灰度级像素个数
%原始直方图graydispro,利用原始直方图计算原始累计直方图graydispro
%t[]计算和原始灰度对应的新的灰度t[],建立映射关系,t坐标代表原始的灰度,t[]代表对应原始坐标的新坐标
%new_graydis是统计新直方图各灰度级像素个数
%计算新的灰度直方图new_graydispro,利用新的直方图计算新的累计直方图new_graydispro
%计算直方图均衡后的新图new_tu
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all
close all
tuu=imread(\'abc.jpg\'); %读入图片
tu=rgb2gray(tuu); %将彩色图片转换为灰度图
graydis=zeros(1,256); %设置矩阵大小
graydispro=zeros(1,256);
new_graydis=zeros(1,256);
new_graydispro=zeros(1,256);
[h w]=size(tu);
new_tu=zeros(h,w);
%计算原始直方图各灰度级像素个数graydis
for x=1:h
for y=1:w
graydis(1,tu(x,y))=graydis(1,tu(x,y))+1;
end
end
%计算原始直方图graydispro
graydispro=graydis./sum(graydis);
subplot(1,2,1);
plot(graydispro);
title(\'灰度直方图\');
xlabel(\'灰度值\');ylabel(\'像素的概率密度\');
%计算原始累计直方图
for i=2:256
graydispro(1,i)=graydispro(1,i)+graydispro(1,i-1);
end
%计算和原始灰度对应的新的灰度t[],建立映射关系
for i=1:256
t(1,i)=floor(254*graydispro(1,i)+0.5);
end
%统计新直方图各灰度级像素个数new_graydis
for i=1:256
new_graydis(1,t(1,i)+1)=new_graydis(1,t(1,i)+1)+graydis(1,i);
end
%计算新的灰度直方图new_graydispro
new_graydispro=new_graydis./sum(new_graydis);
subplot(1,2,2);
plot(new_graydispro);
title(\'均衡化后的灰度直方图\');
xlabel(\'灰度值\');ylabel(\'像素的概率密度\');
%计算直方图均衡后的新图new_tu
for x=1:h
for y=1:w
new_tu(x,y)=t(1,tu(x,y));
end
end
figure,imshow(tu,[]);
title(\'原图\');
figure,imshow(new_tu,[]);
title(\'直方图均衡化后的图\');
//////////////////////////////////////////////////////
另外两种代码:
代码
Matlab
下面的代码来自archiless,注释非常详细,适合初学。
% 数字图像处理程序作业 % 本程序能将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 % 作者;archiless lorder clear all %一,图像的预处理,读入彩色图像将其灰度化 PS=imread(\'PicSample.jpg\'); %读入JPG彩色图像文件 imshow(PS) %显示出来 figure NO 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 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归到相近级的灰度 for i=1:256 GPeq(i)=sum(GP(find(S2==i))); %计算现有每个灰度级出现的概率 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(\'均衡化后灰度级\') %四,图像均衡化 PA=PS; for i=0:255 PA(find(PS==i))=S2(i+1); %将各个像素归一化后的灰度值赋给这个像素 end figure,imshow(PA) %显示均衡化后的图像 figure NO 6 title(\'均衡化后图像\') imwrite(PA,\'PicEqual.bmp\'); |
另一段Matlab的代码,来自 直方图均衡化--图像增强
I=imread(\'LENA256.bmp\'); imshow(I); figure; imhist(I); [m,n]=size(I); hf = zeros(1,256); pa = zeros(1,256); I=double(I); for i = 1:m for j = 1:n hf(I(i,j)+1)=hf(I(i,j)+1)+1;%统计各灰度像素个数 end end bmap=zeros(1,256); for i=1:256 temp=0; for j=1:i temp=temp+hf(j); end bmap(i)=floor(temp*255/(m*n)); end y=zeros(m,n); for i=1:m for j=1:n y(i,j)=bmap(I(i,j)+1); end end y=uint8(y); figure; imshow(y); |