ChenxofHit

直方图和直方图均衡的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);

分类:

技术点:

相关文章: