河北工业大学图像实验报告.docx
《河北工业大学图像实验报告.docx》由会员分享,可在线阅读,更多相关《河北工业大学图像实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
河北工业大学图像实验报告
《数字图像处理》实验报告
软件102班孙世华102442
实验一(4学时)
1、熟悉MATLAB软件的开发环境和基本操作,为编写图像处理程序奠定基础。
例如:
1.矩阵:
A=[123;456];
输入结果为:
>>A=[123;456]
A=
123
456
2.读取图像,并进行显示
I=imread(‘lena.jpg’);
Imshow(I);
输入结果为:
I=imread(‘1.jpg’);
imshow(I);
二、掌握二进制(黑白)图像、灰度图像、彩色图像读和写的基本方法,观察其图像参数,并说明以下程序的显示结果为何是一幅几乎全黑的图像。
clear;closeall;
myi=zeros(20,20);
myi(2:
2:
18,2:
2:
18)=1;
myi=uint8(myi);
figure,imshow(myi,'notruesize');
输入结果为:
clear;
i=imread('2.jpg');
imwrite(i,'22.bmp','bmp'),j=imread('22.bmp');%jpg格式转换为bmp格式
imggray=rgb2gray(i);
imwrite(imggray,'2gray.bmp','bmp'),p=imread('2gray.bmp');%存储为灰度图像
imgbw=im2bw(i,0.5);
imwrite(imgbw,'2binary.bmp','bmp'),q=imread('2binary.bmp');%存储为二值图像
figure;
subplot(2,2,1),imshow(i),title('原彩色图');
subplot(2,2,2),imshow(j),title('转换为bmp格式图像');
subplot(2,2,3),imshow(p),title('灰度图像');
subplot(2,2,4),imshow(q),title('二值图像');
输入下面代码:
clear;closeall;
myi=zeros(20,20);
myi(2:
2:
18,2:
2:
18)=1;
myi=uint8(myi);
figure,imshow(myi,'notruesize');
得到的图像为几乎全黑的,是因为从0变化为1,颜色变化很小,人眼几乎分辨不出来,所以几乎是全黑的,附下图:
三、图像采样和量化相关实验
要求:
1.选择lena.jpg或其它图片,缩小空间分辨率,观察结果并分析
2.选择lena.jpg或其它图片,缩小灰度分辨率,观察结果并分析
1.缩小空间代码率
clear
>>I=imread('1.jpg');
>>P=I;
>>[a,b]=size(I)
a=
379
b=
1650
>>fori=1:
189
forj=1:
1650
P(2*i,j)=P(2*i-1,j);
end
end
>>fori=1:
379
forj=1:
825
P(i,2*j)=P(i,2*j-1);
end
end
>>figure;
>>subplot(1,2,1),imshow(I),title('原图像');
subplot(1,2,2),imshow(P),title('缩小空间分辨率后的图像');
分析:
缩小空间分辨率的图像与原图像比较起来细节变得有些不明显。
2.缩小灰度分辨率
实验代码如下:
I=imread('2.jpg');
[M,N,K]=size(I);
fori=1:
M
forj=1:
N
ifI(i,j)<127
A(i,j)=0;
else
A(i,j)=255;
end
end
end
figure;
subplot(1,2,1);
imshow(I,[]);
subplot(1,2,2);
imshow(A,[]);
四、直方图学习
使用函数:
显示图像直方图imhist()
要求:
显示灰度图像直方图(lena.jpg)
要求:
显示彩色图像直方图(qingwa.jpg)
输入下面的代码:
clear;
i=imread('2.jpg');
x=rgb2gray(i);
figure;
subplot(2,3,1),imshow(i),title('原图');
subplot(2,3,2),imshow(x),title('灰度图');
subplot(2,3,3),imhist(x),title('灰度直方图');
subplot(2,3,4),imhist(i(:
:
1)),title('red直方图');
subplot(2,3,5),imhist(i(:
:
2)),title('green直方图');
subplot(2,3,6),imhist(i(:
:
3)),title('blue直方图');
五、应用MATLAB(或C)语言编写一幅灰度图像直方图统计程序,并选择一幅图像显示其直方图,将结果与MATLAB工具箱提供的灰度直方图函数imhist的处理结果进行比较。
利用以上编写的程序,估算下面图像中瞳孔半径(以像素为单位)。
输入下面代码:
clear;
i=imread('1.jpg');%读取图像1.jpg
p=rgb2gray(i);%转换为灰度图像p
[m,n]=size(p);
h=imhist(p);
h1=h(1:
2:
256);%准备画圈的纵坐标-->数据来自于图像
h2=1:
2:
256;%准备画圈的横坐标就是1到256
figure;
subplot(2,2,1),imshow(i),title('原图');%显示原图像
subplot(2,2,2),imshow(p),title('灰度图');%显示灰度图像
subplot(2,2,3),imhist(p),title('灰度图像直方图');%列出灰度图像直方图
subplot(2,2,4),stem(h2,h1,'r--'),title('火柴梗图');%用红色的绘制火柴梗图
forii=0:
255
a(ii+1)=length(find(p==ii));
end
s1=0;
forii=0:
55
s1=s1+a(ii+1);
end
s2=m*n;
pp=s1/s2;
disp(['pp=',num2str(pp)]);
pp=0.1332
六、傅里叶变换和反变换
fft2:
二维傅里叶变换
ifft2:
二维傅里叶反变换
fftshift:
将零点平移到频谱的中心
ifftshift:
逆ifftshift
abs:
向量绝对值
输入以下代码:
clear
i=imread('11.jpg');
f1=fft2(im2double(i));%二维傅里叶变换
f2=fftshift(f1);%将零点平移到频谱的中心
f3=abs(f2);
f4=ifftshift(f2);
f5=ifft2(f4);
subplot(2,3,1),imshow(i),title('原图');
subplot(2,3,2),imshow(f1),title('fft2');
subplot(2,3,3),imshow(f2),title('fftshift');
subplot(2,3,4),imshow(f3),title('abs');
subplot(2,3,5),imshow(f4),title('ifftshift');
subplot(2,3,6),imshow(f5),title('ifft2');
实验二(4学时)
应用MATLAB工具箱进行图像处理,包括显示图像、格式转换、图像灰度调整、对比度增强、直方图均衡、邻域平均法、中值滤波法、图像代数运算、边缘增强、伪彩色增强、假彩色合成、二值化、边缘检测等;分析处理结果,掌握方法和原理,巩固所学内容。
一、图像增强点运算
1.直方图均衡化
使用函数:
直方图均衡化histeq(’lena.jpg’);
实验要求:
选择一幅直方图不均匀的图像,对该图像进行直方图均衡处理,显示处理前后的图像以及它们的灰度直方图。
实验代码如下:
clear;
i=imread('1.jpg');
p=rgb2gray(i);
j=histeq(p);
subplot(2,3,1),imshow(p),title('灰度图');
subplot(2,3,3),imhist(p),title('原灰度直方图');
subplot(2,3,4),imshow(j),title('均衡化后图');
subplot(2,3,6),imhist(j),title('均衡化后直方图');
2.灰度修正技术:
使用函数:
imadjust();
实验要求:
选择一幅对比度不足的图像,对该图像进行灰度变换,增强对比度,显示增强前、后的图像以及它们的灰度直方图。
实验代码如下:
clear;
i=imread('2.jpg');
p=rgb2gray(i);
j=imadjust(p,[0.40.8],[]);
subplot(2,3,1),imshow(i),title('原彩色图');
subplot(2,3,2),imshow(p),title('灰度图');
subplot(2,3,3),imshow(j),title('增强对比度的图');
subplot(2,3,5),imhist(p),title('原灰度图直方图');
subplot(2,3,6),imhist(j),title('修正后直方图');
1、图像的空间域平滑(使用4-邻域,8邻域进行处理),比较处理结果
例如:
(使用4-邻域进行图像平滑处理)
I=imread('001.png');
imshow(I);
I1=imnoise(I,'gaussian',0.1);
figure;
imshow(I1);
F=[0,1,0;1,0,1;0,1,0]/4;//所用模板(4-邻域)
I2=filter2(F,I1);
figure;
imshow(I2,[]);
实验代码如下:
clear;
i=imread('1.jpg');
p=imnoise(i,'gaussian',0.1);
f1=[010;101;010]/4;%所用模板(4-邻域)
f2=[010;101;010]/8;%所用模板(8-邻域)
j=imfilter(p,f1,'corr','replicate');
k=imfilter(p,f2,'corr','replicate');
subplot(2,2,1),imshow(i),title('原彩色图');
subplot(2,2,2),imshow(p),title('噪声污染后图');
subplot(2,2,3),imshow(j),title('4-邻域处理后图');
subplot(2,2,4),imshow(k),title('8-邻域处理后图');
三、图像的空间域锐化(要求梯度法图像锐化的五种方法)
例如:
第一种锐化方法
[I,map]=imread('H:
\lena.jpg');
I=double(I);
[IX,IY]=gradient(I);
GM=sqrt(IX.*IX,IY.*IY);
OUT1=GM
imshow(OUT1,map);
实验代码如下:
clear;
[P,map]=imread('2.jpg');
S=rgb2gray(P);
I=double(S);
[Gx,Gy]=gradient(I);%计算梯度
G=sqrt(Gx.*Gx+Gy.*Gy);%注意是矩阵点乘
J1=G;%第一种图像增强
J2=I;%第二种图像增强
K=find(G>=5);
J2(K)=G(K);
J3=I;%第三种图像增强
K=find(G>=5);
J3(K)=255;
J4=I;%第四种图像增强
K=find(G<=5);
J4(K)=255;
J5=I;%第五种图像增强
K=find(G<=5);
J5(K)=0;
Q=find(G>=5);
J5(Q)=255;
figure;%显示图像
subplot(2,3,1),imshow(S,map),title('灰度图像');
subplot(2,3,2),imshow(J1,map),title('第一种');
subplot(2,3,3),imshow(J2,map),title('第二种');
subplot(2,3,4),imshow(J3,map),title('第三种');
subplot(2,3,5),imshow(J4,map),title('第四种');
subplot(2,3,6),imshow(J5,map),title('第五种');
4、图像的频率域平滑和锐化(常用的四种低通和高通滤波器)
实验代码如下:
clear;
B=ones(200,200);
fori=1:
50
forj=1:
60
B(i,j)=0;
end
end
fori=1:
60
forj=1:
80
K(i,j)=0.5;
end
end
K1=imnoise(K,'salt&pepper');
fori=1:
60
forj=1:
80
B(100+i,100+j)=K1(i,j);
end
end
figure;
subplot(2,3,1),imshow(B),title('生成的图');
%进行傅里叶变换
f=double(B);
g=fft2(f);
g=fftshift(g);
K=log(1+abs(g));
subplot(2,3,2),imshow(K,[]),title('傅里叶变换生成的图');
%得到相关参数
[M,N]=size(g);
m1=fix(M/2);
n1=fix(N/2);
d0=M/10;
d1=d0*2;
%得到滤波器函数
fori=1:
M
forj=1:
N
d=sqrt((i-m1)^2+(j-n1)^2);
%?
?
?
?
?
if(didealfilter(i,j)=1;
else
idealfilter(i,j)=0;
end
%?
?
?
?
?
?
?
?
?
n=2;
blfilter(i,j)=1/(1+(d/d0)^(2*n));
%?
?
?
?
?
?
?
elfilter(i,j)=exp(-((d/d0)^n));
%?
?
?
?
?
?
?
if(dtlfilter(i,j)=1;
elseif(d>=d0&&d<=d1)
tlfilter(i,j)=(d-d1)/(d0-d1);
else
tlfilter(i,j)=0;
end
end
end
end
%?
?
?
?
resulti=idealfilter.*g;
%?
?
?
?
?
?
resultb=blfilter.*g;
%?
?
?
?
resulte=elfilter.*g;
%?
?
?
?
?
?
?
resultt=tlfilter.*g;
%?
?
?
?
result1=fftshift(resulti);
R1=ifft2(result1);
subplot(2,3,3),imshow(R1,[]),title('理想低通');
%?
?
?
?
?
?
result2=fftshift(resultb);
R2=ifft2(result2);
subplot(2,3,4),imshow(R2,[]),title('巴特沃斯低通');
%?
?
?
?
result3=fftshift(resulte);
R3=ifft2(result3);
subplot(2,3,5),imshow(R3,[]),title('指数低通');
%?
?
?
?
result4=fftshift(resultt);
R4=ifft2(result4);
subplot(2,3,6),imshow(R4,[]),title('梯形低通');
五、伪彩色变换(选择两种方法)和假彩色变换
伪彩色变换(选择两种方法):
1、密度分割法:
clear;
z=imread('lung.jpg');
x=rgb2gray(z);
[m,n]=size(x);
r=zeros(m,n);
g=zeros(m,n);
b=zeros(m,n);
e=max(max(x));
f=min(min(x));
t=(e-f)/3;
%变换图像
fori=1:
m
forj=1:
n
ifx(i,j)<(f+t)
r(i,j)=255;
elseifx(i,j)>(e-t)
b(i,j)=255;
else
g(i,j)=255;
end
end
end
subplot(2,3,1),imshow(z),title('原始图像');
subplot(2,3,2),imshow(x),title('灰度图像');
subplot(2,3,4),imshow(r),title('红色图像');
subplot(2,3,5),imshow(g),title('绿色图像');
subplot(2,3,6),imshow(b),title('蓝色图像');
p=uint8(zeros(m,n,3));
p(:
:
1)=uint8(r);
p(:
:
2)=uint8(g);
p(:
:
3)=uint8(b);
subplot(2,3,3),imshow(p),title('变换图像');
彩色变换合成法:
clear;
z=imread('2.jpg');%如果图像是一幅真彩色RGB图像
w=rgb2gray(z);
[mn]=size(w);
r=w;
g=w;
b=w;
fori=1:
m
%生成Red
forj=1:
n
ifw(i,j)<=127
r(i,j)=255;
elseifw(i,j)>=191
r(i,j)=0;
else
r(i,j)=(w(i,j)-127)*4;
end
end
%生成Green
forj=1:
n
ifw(i,j)<=63
g(i,j)=4*w(i,j);
elseifw(i,j)>=192
g(i,j)=(255-w(i,j))*4;
else
g(i,j)=0;
end
end
%生成Blue
forj=1:
n
ifw(i,j)<=63
b(i,j)=0;
elseifw(i,j)>=127
b(i,j)=255;
else
b(i,j)=(127-w(i,j))*4;
end
end
end
subplot(2,3,1),imshow(z),title('原始图像');
subplot(2,3,2),imshow(w),title('灰度图像');
subplot(2,3,4),imshow(r),title('红色图像');
subplot(2,3,5),imshow(g),title('绿色图像');
subplot(2,3,6),imshow(b),title('蓝色图像');
%合成为伪彩色
p=uint8(zeros(m,n,3));
p(:
:
1)=uint8(r);
p(:
:
2)=uint8(g);
p(:
:
3)=uint8(b);
subplot(2,3,3),imshow(p),title('伪彩色图像');
假彩色变换
clear;
i=imread('2.jpg');
j(:
:
1)=i(:
:
2);
j(:
:
2)=i(:
:
3);
j(:
:
3)=i(:
:
1);
subplot(1,2,1),imshow(i),title('原图像');
subplot(1,2,2),imshow(j),title('假彩色图像');
六、图像分割(边缘提取法和阈值分割法)
例如:
边缘提取的方法
I=imread(‘C:
\1.jpg’);读图象
edge()函数用于灰度图象边缘的提取;生成图象均为二值图像;其参数代表所用的方法
BW=edge(I,’sobel’);sobel边缘提取方法
BW=edge(I,’prewitt’);prewitt边缘提取方法
BW=edge(I,’roberts’);roberts边缘提取方法
BW=edge(I,’log’);拉普拉斯边缘提取方法
实验代码如下:
1、边缘提取的方法
clear;
i=imread('2.jpg');
f1=im2bw(i,0.5);
f2=double(f1);
f3=edge(f2,'sobel');%sobel边缘提取方法
f4=edge(f2,'prewitt');%prewitt边缘提取方法
f5=edge(f2,'roberts');%roberts边缘提取方法
f6=edge(f2,'log');%拉普拉斯边缘提取方法
subplot(2,3,1),imshow(i),title('原彩色图');
subplot(2,3,2),imshow(f1),title('二值图');
subplot(2,3,3),imshow(f3),title('sobel图');
subplot(2,3,4),imshow(f4),title('prewitt图');
subplot(2,3,5),imshow(f5),title('roberts图');
subplot(2,3,6),imshow(f6),title('拉普拉斯图');
2、阈值分割法
clear;
i=imread('1.jpg');
thresh=graythresh(i);%自适应确定阈值
bw1=im2bw(i,thresh);%二值化
bw2=im2bw(i,130/255);%以130为阈值实现二值化,转换为[0,1]区间内
subplot(1,3,1),imshow(i),title('原图像');
subplot(1,3,2),imshow(bw1),title('自动选择阈值');
subplot(1,3,3),imshow(bw2),title('阈值130');