《数字图像处理》实验报告
实验功能:
一、 图像的预处理,读入彩色图像将其灰度化
二、 绘制直方图
三、 直方图均衡化
四、 Butterworth低通滤波器
五、 几何变换
六、 彩色图像分离
2013 年 11 月 2 日
目 录
程序整体功能介绍:
我们这实验主要实现了六个功能,用软件系统自带函数和自己写的函数实现将彩色图像灰度化、绘制直方图、直方图均衡化、Butterworth低通滤波器、几何变换、彩色图像分离。
子功能的理论介绍
实验一,图像的预处理,读入彩色图像将其灰度化
灰度图像是数组矩阵,矩阵的值表示灰度浓淡。使用灰度变换函数来实现彩色图像的灰度化,灰度变换函数形式:s=T(r),r代表图像f中的灰度,s表示图像g中的灰度值,两者在图像中处于相同的坐标(x,y)imwrite(rgb2gray(PS),'PicSampleGray.bmp');将彩色图片灰度化并保存,这个函数把输入灰度图像的窄范围扩展到输出灰度的宽范围。PS=rgb2gray(PS),灰度化后的数据存入数组
实验二,绘制直方图
灰度直方图是灰度级的函数,直方图定义离散函数h(r)=n,r是【0,G】间隔内第k级灰度,n为图像中出现r这种灰度的像素数。用h(r)的所有元素除以图像中像素总数,就可以简单的得到归一化直方图。对于整数图像k=0,1,2,3,…,L-1,可用p(r)表示灰度级r出现的概率。
for k=0:255
GP(k+1)=length(find(PS==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置
end
figure,bar(0:255,GP,'g') ,%绘制直方图
实验三,直方图均衡化
直方图均衡化实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值得数量相等。当灰度级为离散值时,我们利用处理直方图来实现图像均衡化。利用公式s=T(r)==,j=0,1,2,…,L-1—代表给定图像的灰度值直方图,在归一化图中,各个值大致是图像取灰度级的概率,k=0,1,2,3,…,L-1,s是输出的图像灰度值,对应输入图像的灰度值为r
for i=1:256
for j=1:i
S1(i)=GP(j)+S1(i); %计算Sk
end
end
S2=round((S1*256)+0.5); %将Sk归到相近级的灰度
for i=1:256
GPeq(i)=sum(GP(find(S2==i))); %计算现有每个灰度级出现的概率
实验四,Butterworth低通滤波器
n阶的布特沃斯低通滤波器具有从滤波中心到D的距离的截止频率,传递函数为:H(u,v)=,D为整数,D(u,v)为点(u,v)到滤波器中心的距离。与理想低通滤波器不同,布特沃斯低通滤波器的传递函数在D点没有尖锐的不连续。在实验中我们使用的是2阶布特沃斯低通滤波器,用傅里叶函数将数组转换为矩阵,再计算低通滤波器传递函数g=fft2(f); % 傅立叶变换
g=fftshift(g); % 转换数据矩阵
[M,N]=size(g);
nn=2; % 二阶巴特沃斯(Butterworth)低通滤波器
d0=50;
m=fix(M/2); n=fix(N/2);
for i=1:M
for j=1:N
d=sqrt((i-m)^2+(j-n)^2);
h1=1/(1+0.414*(d/d0)^(2*nn)); % 计算低通滤波器传递函数
result1(i,j)=h1*g(i,j);
实验五,几何变换
几何变换改变了图像中像素间的空间关系,可以使图像变大、变小、旋转等。实验中我们设计了放大1.5倍、缩小0.8倍装置后图像功能。几何变换主要是通过坐标点变换、仿射变换等来实现,假设(w,z)和(x,y)是两个空间的坐标系统,分别为输入空间和输出空间,几何坐标变换可定义为输入空间点到输出空间点的映射:(x,y)=T{(w,z)},T{·}叫做正向变换或正向映射。仿射变换是从一个向量空间变换到另一个向量空间,由线性部分组成,表示成矩阵相乘部分、加法部分、偏移部分。变换公式= +,这个公式可以写成=T,T为仿射矩阵,重要的仿射变换包括缩放、旋转、平移、裁剪和反射,为了实现不同的种类的变换,可以设置不同的T的值。
实验六,彩色图像分离
一幅RGB图像就是大小的彩色像素的数组,其中每个彩色像素点都是在特定空间位置的彩色图像所对应的红、绿、蓝三个分量。分量图像的数据类决定了它们的取值范围,如果一幅RGB图像的数据类是double,那么取值范围就是[0,1],类似的,对于unit8和unit16类的RGB图像,取值范围分别是[0,255],[0,65535],用来表达这些分量图像像素值得比特数决定了一幅RGB图像的比特深度。fR、fG、fB分别表示三幅RGB分量图像,RGB图像就是利用cat操作将这些分量图像组合而成的彩色图像:rab.image=cat(3,fR,fG,fB).
子程序的实现(程序)
图像的预处理,读入彩色图像将其灰度化
PS=imread('1.jpg'); %读入JPG彩色图像文件
imwrite(rgb2gray(PS),'PicSampleGray.bmp'); %将彩色图片灰度化并保存
PS=rgb2gray(PS); %灰度化后的数据存入数组
imshow(PS) %显示出来
%二,绘制直方图
[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') %绘制直方图
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)+0.5); %将Sk归到相近级的灰度
for i=1:256
GPeq(i)=sum(GP(find(S2==i))); %计算现有每个灰度级出现的概率
end
figure,bar(0:255,GPeq,'b') %显示均衡化后的直方图
title('均衡化后的直方图')
xlabel('灰度值')
ylabel('出现概率');
%四,Butterworth低通滤波器
I= imread('1.jpg');
figure;
subplot(1,2,1);
imshow(I);
title('test1.jpg');
f=double(I);
g=fft2(f); % 傅立叶变换
g=fftshift(g); % 转换数据矩阵
[M,N]=size(g);
nn=2; % 二阶巴特沃斯(Butterworth)低通滤波器
d0=50;
m=fix(M/2); n=fix(N/2);
for i=1:M
for j=1:N
d=sqrt((i-m)^2+(j-n)^2);
h1=1/(1+0.414*(d/d0)^(2*nn)); % 计算低通滤波器传递函数
result1(i,j)=h1*g(i,j);
end
end
result1=ifftshift(result1);
J2=ifft2(result1);
J3=uint8(real(J2));
subplot(1,2,2);
imshow(J3);
title('低通滤波图t.jpg'); % 显示滤波处理后的图像
%六,几何变换
f=imread('1.jpg');
f=double(f);
f1=imresize(f,1.5,'bilinear');
figure;
imshow(uint8(f1));
title('放大1.5倍');
f2=imresize(f,0.8,'bilinear');
figure;
imshow(uint8(f2));
title('缩小0.8倍');
i=imread('1.jpg');
[height,width,dim]=size(i);
tform=maketform('affine',[-1 0 0;0 1 0;width 0 1]);
b=imtransform(i,tform,'nearest');
tform1=maketform('affine',[0 1 0;1 0 0;0 0 1]);
c=imtransform(i,tform1,'nearest');
%七,彩色图像分离
a=imread('1.jpg');
[r,c,d]=size(a);
%提取红色分量
red=a;
red(:,:,1)=a(:,:,1);
red(:,:,2)=zeros(r,c);
red(:,:,3)=zeros(r,c);
red=uint8(red);
subplot(131),imshow(red);
%提取绿色分量
green=zeros(r,c);
green(:,:,2)=a(:,:,2);
green(:,:,1)=zeros(r,c);
green(:,:,3)=zeros(r,c);
green=uint8(green);
subplot(132),imshow(green);
%提取蓝色分量
blue=zeros(r,c);
blue(:,:,1)=zeros(r,c);
blue(:,:,2)=zeros(r,c);
blue(:,:,3)=a(:,:,3);
blue=uint8(blue);
subplot(133),imshow(blue);
子功能的输入、输出、结果
原图
实验一,输入PS=imread('1.jpg')
输出imshow(PS)
实验二,输入输入PS=imread('1.jpg')
输出title('原图像直方图')
实验三,输入PS=imread('1.jpg')
输出title('均衡化后的直方图')
实验四,输入I= imread('1.jpg');
输出imshow(J3);
title('低通滤波图t.jpg')
实验五,输入f=imread('1.jpg')
输出imshow(uint8(f2));
title('放大1.5倍');
输出imshow(uint8(f2));
title('缩小0.8倍');
输入i=imread('1.jpg');
输出imshow(c);imwrite(c,'nir装置后图像.jpg');
实验六,输入a=imread('1.jpg');
输出imshow(red);
imshow(green);
imshow(blue);
第二篇:自动点焊技术之数字图像处理matlab实验报告_半色调打印技术
自动点焊技术之数字图像处理
实验报告
实验名称:Image Printing Program Based on Halftoning
实验编号:Proj02-01
作 者:珠海博泰科技:莫工
实验日期:20##年11月30日
摘 要:本实验采用半色调技术对图像进行打印和显示,先编程产生一个256*256大小渐变的测试图像,然后再编写一个半色调技术的打印程序,再用打印程序分别打印测试图像以及书本中给的3个不同图像细节的图片,并比较变换前后的图像效果,验证了书本中图2.23偏爱曲线所揭示的结论,即对具有大量细节的图像,可能只需要少量的灰度级就可以表示。
一、技术论述
将图像中各像素点变换成3*3的点阵,256个灰度级别量化为10个灰度级,每个灰度级用3*3的矩阵点来表示,用黑点全部填充的9个点近似表示灰度级为0,全部填白色表示灰度级为9,其他的模式表示这二者之间的灰度级。
对应关系可表示为:dot(i,j)/10=gray(i,j)/256.
其中gray(i,j)为原像素点的灰度级,dot(i,j)为变换后的灰度级 。10灰度级的点阵如下图所示:
二、实验结果及讨论
实验中所使用的原图片以及经过半色调技术转换后的图片如下:
整体实验产生的图片如下
实验结果讨论:
实验结果符合书本图2.23的结论,图2-3图像的细节较小,图2-5图像的细节中等,图2-7的图像细节较多, 经过半色调技术变换后,细节较多的图2-7使人感受到图像质量变化不大,这一实验表明,当图像中的细节增加时,等偏爱曲线会变得更加垂直,所以,对于有大量细节的图像,可能只需要较少的灰度级就行。
附录:
1、主M程序:charpter2.m
该程序调用半色调打印函数convert(),完成相关图像的打印
源码如下:
function exe2()
%
%功能: 第2章实验题目
%输入参数:无
%
%输出参数:无
%
wH=2; wL=4;
%人为产生一个256*256大小的渐变测试图像
image256=zeros(256,256)
for(i=1:256)
image256(:,i)=(i-1)*ones(256,1);
end
image256=uint8(image256);
imwrite(image256,'picture256.bmp');
% image256=creat_picture();
%image256=imread('picture256.jpg');
subplot(wH,wL,1);
imshow(image256);
title('图2-1:256*256原图像');
%对程序生成的256*256大小的渐变测试图像实行半色调变换
y=convert(image256);
subplot(wH,wL,2);
imshow(y);
imwrite(y,'p2-2.jpg');
title('图2-2:半调色变换后256*256图像');
%对课本图2.2(a)到(c)进行半调色打印对比
img222a=imread('d:\data_s\Fig2.22(a).jpg');
subplot(wH,wL,3);
imshow(img222a);
title('图2-3:图像2.22a原图');
y=convert(img222a);
subplot(wH,wL,4);
imshow(y);
imwrite(y,'p2-4.jpg');
title('图2-4:图像2.22a原图半色调变换图');
img222b=imread('Fig2.22(b).jpg');
subplot(wH,wL,5);
imshow(img222b);
title('图2-5:图像2.22b原图');
y=convert(img222b);
subplot(wH,wL,6);
imshow(y);
imwrite(y,'p2-6.jpg');
title('图2-6:图像2.22b原图半色调变换图');
img222c=imread('Fig2.22(c).jpg');
subplot(wH,wL,7);
imshow(img222c);
title('图2-7:图像2.22c原图');
y=convert(img222c);
subplot(wH,wL,8);
imshow(y);
imwrite(y,'p2-8.jpg');
title('图2-8:图像2.22c原图半色调变换图');
2、半色调打印函数convert()
function y = convert(x)
[r,c]=size(x);%得到这个图像有多少行多少列
%A4纸的21.6 * 27.9cm 换算成英寸为 8.5 * 10.98
pixelsperinch=96;
widthmaxpixels = 8.5*pixelsperinch;
heighminpixels = 11*pixelsperinch;
rscale=double(r)/widthmaxpixels;
cscale = double(c)/heighminpixels;
scale = rscale;
if(scale<cscale)
scale=cscale;
end
if(scale >1)
downsampling_ave(x,fix(scale));
end
gimg = fix(double(x)/25.6);%求这个点的灰度级为10个灰度级中的哪一个
y=zeros(r*3,c*3);%先清掉灰度矩阵
%得到一个10维的灰度级
dotz = zeros(3,3,10);
dotz(1:3,1:3,1:5) = zeros(3,3,5);
dotz(1,2,2:5) = 255*ones(1,1,4);
dotz(3,3,3:5) = 255*ones(1,1,3);
dotz(1,1,4:5) = 255*ones(1,1,2);
dotz(3,1,5) = 255;
dotz(1:3,1:3,6:10) = 255*ones(3,3,5);
dotz(2,2,6:9) = zeros(1,1,4);
dotz(2,1,6:8) = zeros(1,1,3);
dotz(3,2,6:7) = zeros(1,1,2);
dotz(2,3,6) = 0;
%把图像中的每个像素点换成某个灰度级的3*3的矩阵
for(i=1:r)
for(j=1:c)
level=gimg(i,j);
y((i-1)*3+1:i*3,(j-1)*3+1:j*3)=dotz(1:3,1:3,level+1);
end
end
y=uint8(y);%强制转为8位整数
end
3、实验中产生的单幅图片
图3-1 半调色变换后256*256图像
图3-2 Fig2.22(a) 半色调打印图像
图3-3 Fig2.22(b) 半色调打印图像
图3-4 Fig2.22(c) 半色调打印图像