数字图像处理报告
上机内容及调试分析
1.编程实现打开一个灰度图像,能够显示图像。
clearall;
t=imread('F:数字图像处理上机\girl.bmp');%读取图像
I=rgb2gray(t);%将彩色图像转为灰度图像
imshow(I);%显示图像
title('显示灰度图像');
2.用灰度图形式表示彩色图象,分别显示1幅彩色图象的R,G,B分量(每个分量用8bit表示),和这幅彩色图象的H,S,I分量(每个分量也各用8bit表示)。
8位RGB图像的颜色数据是在[0255]之间的整数,RGB模型使用红绿蓝三原色的亮度来定量表示颜色,它为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。HSI模型用HSI三参数描述颜色的特性,其中,H表示色调,S表示饱和度,I表示亮度。
这个程序可以用2种方法实现:第一种方法,先提取图像的RGB分量,再RGB与HSI之间的变换公式求出HSI;第二种是,在程序中调用已写好的RGB与HSI之间的转换函数rgb2hsi(),然后直接提取转换后的HSI分量。下面是第一种方法:(注意图像的RGB分量在计算前要转换成double型)
clearall;
A=imread('F:数字图像处理上机\girl.bmp');%读取图像
R=A(:,:,1);G=A(:,:,2);B=A(:,:,3);
r=double(R);g=double(G);b=double(B);
min=min(min(r,g),b);
I=(r+g+b)/3;%计算I分量
S=1-min./I;%计算S分量
m=sqrt((r-g).^2+(r-b).(g-b));
w=acos(0.5((r-g)+(r-b))./(m+eps));
ifG>B
H=w;
else
H=2pi-w;
end;
H=H/(2pi);%计算H分量
subplot(231);imshow(R);_label('R分量');%分别显示彩色图象的R,G,B分量subplot(232);imshow(G);_label('G分量');
subplot(233);imshow(B);_label('B分量');
subplot(234);imshow(H);_label('H分量');%分别显示1幅彩色图象的H,S,I分量subplot(235);imshow(S);_label('S分量');
subplot(236);imshow(I,[]);_label('I分量');
3.编程实现图像傅变换。
一个静止的图像可以看做二维数据阵列,代码中fftshift的作用是让正半轴部分和负半轴部分的图像分别关于各自的中心对称。而直接用fft得出的数据与频率不是对应的,fftshift将变换后的图像频谱中心从矩阵原点移到矩阵中心。另外,由于图像的傅变换矩3
阵中的元素一般是复数,应对结果求模。
clearall;
A=imread('F:数字图像处理上机\girl.bmp');%读取图像
B=rgb2gray(A);
C=fft2(B);%实现图像傅变换
K=fftshift(C);
subplot(121);imshow(B);_label('灰度图像');
subplot(122);imshow(log(abs(K)),[]);_label('傅变换谱');
4.用直接灰度变换改变图像(求反,增强对比度,动态范围压缩,灰度切分)
直接灰度变换改变图像的图像求反,就是将原图像灰度值翻转,该方法适用于增强嵌入于图像暗色区域的白色或灰色细节。增强图像对比度就是是增强原图的各部分的反差。实际中往往是通过增强原图里某两个灰度值间的动态范围来实现的。对数与对比度拉伸变换是进行动态处理的基本方式,其中要用到对数变换公式对原图像进行动态压缩。灰度切割的目的是增强特定范围的对比度,用来突出图像中特定灰度范围的亮度。
调试程序中遇到到的问题有:1.MATLAB中读入图像的数据类型是4
uint8,而在矩阵中使用的数据类型是double,使用前要用函数转换成double。2.在写程序的时候会把一些图像修饰与控制的符号的字母写错,如将_label写成_lable。3.for循环中,记住matlab中最小的下标是1,不是从0开始的。
clearall;
A=imread('F:数字图像处理上机\girl.bmp');%读取图像
B=rgb2gray(A);
%K=imadjust(B);
I=double(B);
K=imadjust(B,[0.2,0.7],[]);%在指定的范围进行灰度调整
J=256-1-I;%将原图像灰度级翻转
J=uint8(J);
subplot(131);imshow(B);_label('(a)原始图像');
subplot(132);imshow(J);_label('(b)图像求反');
subplot(133);imshow(K);_label('(c)增强对比度');
clearall;
A=imread('F:数字图像处理上机\girl.bmp');%读取图像
B=rgb2gray(A);
c=/log(256);%尺寸比例常数
_=0:1:255;
y=clog(1+_);%变换公式
figure;
subplot(211);plot(_,y);
a_istight;%使坐标系的最大值和最小值和你的数据范围一致
_label('变换曲线');
[m,n]=size(B);%m中存储的是行数,n中存储的是列数
_=double(B);
fori=1:m
forj=1:n;
g(i,j)=clog(_(i,j)+1);
subplot(212);imshow(mat2gray(g));%实现图像矩阵的归一化操作_label('动态范围压缩后的图'
%灰度切割的目的是增强特定范围的对比度,用来突出图像中特定灰度范围的亮度clearall;
A=imread('F:数字图像处理上机\girl.bmp');%读取图像
B=rgb2gray(A);
I=double(B);
[M,N]=size(I);
fori=1:M%记住matlab中最小的下标是1,不是从0开始的
forj=1:N
ifI(i,j)<=50
I(i,j)=40;
elseifI(i,j)<=160
I(i,j)=200;
else
I(i,j)=100;%其中的,40,50,160,200是任意设定的
I=uint8(I);
figure;%别把字母写错了
subplot(121);imshow(B);_label('原始图像');
subplot(122);imshow(I);_label('灰度切分变换后的图像');
5.做出直方图,进行直方图均衡化。
直方图均衡化是一种使输出图像直方图近似服从均匀分布的变化算法。对比均衡化前后的图像可以看出,原直方图占据的灰度范围较窄。直方图均衡增加了灰度动态的范围,增加了图像的对比度,许多图像的细节可以看得清楚。代码中用到了2个函数,其中,histeq函数实现对输入图像的直方图均衡化;imhist函数用于显示图像直方图。其代码如下:
clearall;
A=imread('F:数字图像处理上机\girl.bmp');%读取图像
B=rgb2gray(A);
J=histeq(B);%实现对输入图像的直方图均衡化
subplot(411);imshow(B);title('原始图像');
subplot(412),imhist(B);title('直方图');%用于显示图像直方图
subplot(413),imshow(J);title('直方图均衡化效果');
subplot(414),imhist(J);title('图像均化后的直方图');
6.用空域和频域滤波器,对图像进行平滑,并比较两种方法得到图像质量。
平滑(低通)滤波器的作用是减弱或消除傅空间的高频分量,但不影响低频分量。因为高频分量对应图像中的区域边缘等灰度值具有较快变化的部分,滤去这些分量可使图像变得平滑。它可以模糊处理和减少噪声。频域滤波增强是将图像空间域变换到频域,在频域空间对图像进行滤波处理。本题中我在时域中采用的是线性平滑滤波器,在频域采用巴特沃斯低通滤波器。
其代码及相关分析如下:
clearall;
A=imread('F:数字图像处理上机\girl.bmp');%读取图像
B=rgb2gray(A);
I=imnoise(B,'saltpepper',0.02);
subplot(141),imshow(B);title('原始图像');
subplot(142),imshow(I);title('添加椒盐噪声图像');
K1=filter2(fspecial('average',5),I);%进行55模板平滑滤波
%fspecial函数用于创建一个指定的滤波器模板
%average均值滤波器
%filter2用于进行二维线性滤波
K2=filter2(fspecial('average',9),I);%进行55模板平滑滤波
subplot(143),imshow(uint8(K1));title('55模板平滑滤波');
subplot(144),imshow(uint8(K2));title('99模板平滑滤波');
%用butterworth低通滤波器进行频域滤波增强
%理想低通滤波器有明显的振铃现象,butterworth滤波效果较好
%振铃现象:半径D0越小,模糊越大;半径D0越大,模糊越小(本题中可以改变d0的值去验证)
clearall;
A=imread('F:数字图像处理上机\girl.bmp');%读取图像
B=rgb2gray(A);
I=imnoise(B,'saltpepper',0.02);
subplot(121),imshow(I);title('添加椒盐噪声图像');%%注意这个语句要紧随其后,放在后面,容易读取出错
I=double(I);
f=fft2(I);%采用傅变换
g=fftshift(f);%数据矩阵平衡;
[M,N]=size(f);
n=2;%3阶butterworth低通滤波器
d0=20;%截止频率
n1=floor(M/2);%floor(_):不超过_的最大整数.(高斯取整)
n2=floor(N/2);
fori=1:M
forj=1:N
d=sqrt((i-n1)^2+(j-n2)^2);
h=1/(1+(d/d0)^(2n));%butterworth低通滤波器的传递函数
g(i,j)=hg(i,j);
g=ifftshift(g);
g=uint8(real(ifft2(g)));
subplot(122),imshow(g);title('低通滤波后的图像');
由图可以看出,在时域用邻域平均法进行平滑滤波可以很好的抑制噪声,但同时也引起了模糊,模糊程度与邻域半径成正比,即99模板平滑滤波的效果要比55模板模糊。由此可见,所用平滑模板尺寸增加,对噪声消除有所增强,但图像变得更加模糊。另外,巴特沃斯低通滤波器进行频域滤波可以很好的削弱振铃现象。振铃现象:半径D0越小,模糊越大;半径D0越大,模糊越小(本题中可以改变d0的值去验证)。
在程序调试中遇到的问题:1.在程序语句比较多的情况下,图像显示语句imshow(I),要紧随其后,放在后面,容易读取出错。2.选用巴特沃斯低通滤波器时候注意截止频率的选择。3.在调试中,直接用电脑的灰度图像会遇到这样的问题Undefinedfunctionormethod'conv2'forinputargumentsoftype'double'andattributes'full3dreal'。为什么换张彩色的进行灰度处理后就可以,直接用灰度的怎么不行
原因是:用电脑的灰度图像,用matlab读取时,显示的是3维的,
要把它转为2维的才可以。
7.用空域和频域滤波器,对图像进行锐化,并比较两种方法得到图像质量。
锐化(高通)滤波器的作用,它能减弱或消除傅空间的低频分量,但不影响高频成分。因为低频分量对应图像中灰度值缓慢变化的区域,因而与图像的整体对比度和平均灰度值等有关,将这些分量滤去可使图像锐化。它的目的是使图像的边缘信息突出,加强图像的轮廓特征。本题在时域我采用拉算子的线性高通滤波器,在频域采用的是巴特沃斯低通滤波器。
%图像的锐化与平滑相反,在图像传输和变换过程中,因受到干扰会退化,比如图像模糊.%图像锐化就是使边缘及轮廓线模糊的图像变得清晰,使细节变得清晰.
%下面用线性锐化滤波对图像进行锐化滤波处理(采用拉算子对模糊图像增强)clearall;
A=imread('F:数字图像处理上机\girl.bmp');%读取图像
B=rgb2gray(A);
subplot(121);imshow(B);title('原始图像');
I=double(B);%转换为数据类型double的双精度型
%H=[010;1-41;010];%拉算子
H=[111;1-81;111];%这个效果较好
%H=[0-10;-14-1;0-10];%这个效果不明显(低通)
J=conv2(I,H,'same');%用拉算子对图像进行二维卷积运算
K=I-J;%增强图像为原始图像减拉算子滤波后的图像
subplot(122);imshow(K);title('锐化滤波处理后的图像');
%用butterworth高通滤波器进行锐化滤波及增强处理
%fi_(_):截尾取整.floor(_):不超过_的最大整数.(高斯取整)
clearall;
A=imread('F:数字图像处理上机\girl.bmp');%读取图像
B=rgb2gray(A);
subplot(131);imshow(B);title('原始图像');
I=double(B);%转换为数据类型double的双精度型
f=fft2(I);%傅变换
g=fftshift(f);%数据矩阵平衡
%subplot(133);imshow(log(abs(g)),[]);%频谱图
[M,N]=size(f);
nn=2;%2阶betterworth滤波器
d0=10;%截断频率为10
m=floor(M/2);
n=floor(N/2);%也可以使用fi_(_)函数
fori=1:M
forj=1:N
d=sqrt((i-m)^2+(j-n)^2);
ifd==0
h1=0;
h2=0.5;
else
h1=1/(1+0.414(d0/d)^(2nn));%计算传递函数
h2=1/(1+0.414(d0/d)^(2nn))+0.5;%高频加强滤波器就是在设计滤波器传递函数时,加上一个0-1之间的常数
s1(i,j)=h1g(i,j);
s2(i,j)=h2g(i,j);
s1=ifftshift(s1);
s1=uint8(real(ifft2(s1)));%显示betterworth高通滤波后的结果
subplot(132);imshow(s1);title('betterworth高通滤波后的图像');
s2=ifftshift(s2);
s2=uint8(real(ifft2(s2)));%显示betterworth高通加强滤波结果
subplot(133);imshow(s2);title('betterworth高通加强滤波图像');
由运行结果可以看出,用线性锐化滤波对图像进行锐化处理后,图像的模糊部分得到了锐化,边缘部分得到了增强,边界更明显。但图像以前清晰的地方,经滤波后发生了失真,这是拉算子的缺点。用巴特沃斯高通滤波器得到的输出图像振铃效果不明显,图像高频部分突出。但是,图像经高通滤波器滤波后,许多低频信号没有了,即图像的平滑区基本消失了,这个问题要用高频加强滤波来弥补。所以,由上图可知,用高频加强滤波可以得到比单纯经过高通滤波效果好的增强图像。
在程序调试中遇到的问题:1.用线性锐化滤波对图像进行锐化滤波处理,采用不同的拉算子对模糊图像增强的效果不同。
2.m=floor(M/2),n=floor(N/2)将变换后的图像频谱中心移到原点,也可以用函数fi_(截尾取整)来代替。3.注意巴特沃斯高通滤波器的截断频率的选取。4.高频加强滤波器在设计滤波器传递函数时,加上13
一个0-1之间的常数。
8选用两种压缩算法,对图像进行压缩。并比较这两种算法。
选用两种压缩算法,对图像进行压缩。本题中我选用了基于FFT的图像压缩技术和DCT(离散余弦变换)。二者都属于变换编码,变换编码不是一次对整幅图像进行变换和编码,而是将图像分成nn个子图像后分别处理。因为小图像的变换计算容易,并且距离较远的像素之间的相关性比距离较近之间的相关性小。它首先将一幅NN的图像分割成(N/n)2个子图像,然后对子图像进行变换,解除子图像像素间的相关性,达到用少量的变换系数包含尽可能多的图像信息目的。接下来有选择地消除或粗量化带有很少信息的变换系数。最后的编码,一般采用变长码对量化后的系数进行编码。DCT(离散余弦变换)具有把高度相关数据能量集中的能力,它类似于离散傅变换,且得到的变换系数是实数。
下面是两种压缩方法的代码及相关说明:
1.基于FFT的图像压缩
%%基于FFT的图像压缩技术
clearall;
cr=0.125;%设置压缩比,cr=0.5为2:1压缩,cr=0.125为8:1压缩
A=imread('F:数字图像处理上机\g.jpg');%读取图像
B=rgb2gray(A);
I=double(B)/255;%图像为256级灰度值,对图像进行归一化操作
subplot(121);imshow(B);title('原始图像');
fftcoe=blkproc(I,[88],'fft2(_)');%将图像分割成88的子图,进行FFT变换coevar=im2col(fftcoe,[88],'distinct');
coe=coevar;
[y,ind]=sort(coevar);
[M,N]=size(coevar);
snum=-cr;%根据压缩比确定要变0的系数个数
%舍去不重要的系数
fori=1:N
coe(ind(1:snum),i)=0;%将最小的snum个变换系数清零
B2=col2im(coe,[88],[512512],'distinct');%重新排列系数矩阵,其中512512为原图像的像素
%对子图像块进行FFT逆变换,获取各个子图像的复原图,并显示压缩图像
I2=blkproc(B2,[88],'ifft2(_)');%对截取后的变换系数进行FFT逆变换
subplot(122);imshow(I2);title('压缩比为8:1的图像');%显示压缩后的图像%col2im函数,用于将向量重新排列成图像块
2.基于DCT的图像压缩
%DCT是先将整体图像分为NN像素块,然后对NN像素块逐一进行DCT变换,本题中N=8.clearall;
A=imread('F:数字图像处理上机\girl.bmp');%读取图像
B=rgb2gray(A);
B=im2double(B);%图像存储类型转换,函数im2double将其值归一化到0~1之间subplot(121);imshow(B);title('原始图像');
T=dctmt_(8);%离散余弦变换矩阵,产生二维DCT变换矩阵
%计算二维DCT,矩阵T及其转置是DCT函数P1_P2的参数
I=blkproc(B,[8,8],'P1_P2',T,T');%二值掩模,用来压缩DCT系数,只留下DCT系数中左上角的10个
mask=[11110000;11100000;
11000000;10000000;
00000000;00000000;
00000000;00000000];
I1=blkproc(I,[88],'P1._',mask);%只保留DCT变换的10个系数
I2=blkproc(I1,[88],'P1_P2',T',T);%重构图像
subplot(122);imshow(I2);title('余弦变换压缩后的图像');
FFT图像压缩时,可以设置压缩比,cr=0.5为2:1压缩,cr=0.125为8:1压缩。DCT是先将整体图像分为NN像素块,然后对NN像素块逐一进行DCT变换,本题中N=8。由上图可以看出,DCT比FFT有更强的信息集中能力。
调试中遇到的问题:1.用FFT进行图像压缩时,注意压缩比的设置。
2.用重新排列系数矩阵函数col2im(coe,[88],[512512],'distinct')中,注意[512512]是原图像的像素值。3.对Matlab中自带的相关函数,要查help,注意其用法,函数名不能写错。
9对图像进行边缘检测,显示边缘检测后的结果图像。
图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。但是检测出的边缘并不是真实图像的边缘,由于图像是二维的,实际物体是三维的,从三维到二维的投影会造成信息的丢失。另外,由于噪声等因素的影响,一些边16
缘不一定被检测出来,所以,检测出来的边缘不一定代表实际的边缘。本题中用应用高斯-拉算子(LOG)和canny算子分别检测边缘。其代码及相关说明如下:
%应用高斯-拉算子(LOG)检测边缘,该算子首先用高斯函数对图像作平滑滤波处理%然后用拉算子检测边缘,克服了拉算子抗噪声弱的特点
%运用canny算子检测边缘,会将一些高频边缘平滑掉,造成边缘丢失
clearall;
A=imread('F:数字图像处理上机\girl.bmp');%读取图像
B=rgb2gray(A);
subplot(131);imshow(B);title('原始图像');
[g,t]=edge(B,'log');%运用LOG算子检测边缘
[k,t]=edge(B,'canny');%运用canny算子检测边缘
subplot(132);imshow(g);title('LOG算子分割结果');
subplot(133);imshow(k);title('canny算子分割结果'
由上图可以看出,LOG算子在抑制噪声的同时将原来比较尖锐的边缘也平滑掉了,造成这些尖锐边缘无法被检测到,而且容易出现虚假边缘。本题中相比LOG算子,canny算子检测图像的边缘效果要好一点,但同样该算子也会将一些高频边缘平滑掉,造成边缘的丢失。在边缘检测中,边缘定位能力和噪声抑制能力是一个矛盾体,每种算子都有各自的优缺点,关键是在二者之间找到一个平衡。
10.编写一副灰度图像的DCT变换,walsh变换,以及小变换的结果,分别显示原始图像与变换后的图像。
离散余弦变换(DCT):在图像数据压缩和编码方面,可以用DCT将图像表示成频域数据,根据压缩的需求,忽略一部分高频数据,可以使数据量减少,达到压缩的目的。可以用函数dct2()实现二维离散余弦变换。
walsh变换:沃函数与哈变换是等价的,沃变换的主要优点是在于存储空间少和运算速度快。
小变换:小变换是时间频率的局部化分析,它通过伸缩平移运算对信号逐步进行多尺度细化,最终达到高频处时间细分,低频处频率细分,能自动适应时频信号分析的要求,从而可聚焦到信号的任意细节,解决了Fourier变换的困难问题。
其代码及相关说明如下:
clearall;
A=imread('F:数字图像处理上机\girl.bmp');%读取图像
B=rgb2gray(A);
subplot(121);imshow(B);title('原始图像');
Y=dct2(B);%DCT变换
subplot(122);imshow(Y);title('DCT变换后的图像');
%图片的数据类型是uint8,要用函数转换成double
clearall;
%A=imread('F:数字图像处理上机\girl.bmp');%读取图像
%I=rgb2gray(A);
%subplot(121);imshow(I);title('原始图像');
I=zeros(2.^8);%产生全0矩阵
I(2.^7-2.^4+1:2^7+2.^4,2.^7-2.^4+1:2.^7+2.^4)=ones(22.^4);subplot(121);colormap(gray(100)),imagesc(I);title('原始图像');
[m,n]=size(I);%数据维数
fori=1:n
wht(:,i)=hadamard(n)I(:,i)/m;%对每一列作沃-哈变换
forj=1:m
wh(:,j)=hadamard(n)wht(j,:)'/n;%对进行列的沃-哈变换后的系数进行沃-哈变换
wh=wh';
subplot(122);colormap(gray(100)),imagesc(wh);title('变换后的图像');%gray(100)就生成了100种从黑到白的渐变色
%colormap是用来控制曲面图的颜色的,image是画出的连续的灰度图
%小变换是时间频率的局部化分析,它通过伸缩平移运算对信号逐步进行多尺度细化,%最终达到高频处时间细分,低频处频率细分,能自动适应时频信号分析的要求.clearall;
A=imread('F:数字图像处理上机\girl.bmp');%读取图像
I2=rgb2gray(A);
subplot(231);imshow(I2);title('原始图像');
[cA1,cH1,cV1,cD1]=dwt2(I2,'bior3.7');%做一层二维离散小变换
%二维小变换,bior3.7是双正交样条小对应的滤波器
A1=upcoef2('a',cA1,'bior3.7',1);%二维小分解系数的直接重构H1=upcoef2('h',cH1,'bior3.7',1);
V1=upcoef2('v',cV1,'bior3.7',1);
D1=upcoef2('d',cD1,'bior3.7',1);
subplot(232);image(wcodemat(A1,192));%wcodemat函数,对数据矩阵进行伪彩色编码
Title('近似值系数A1');
subplot(233);image(wcodemat(H1,1000));
Title('水平细节系数H1');
subplot(234);image(wcodemat(V1,1000));
Title('垂直细节系数V1');
subplot(235);image(wcodemat(D1,1000));
title('对角细节系数D1'
上图中upcoef2函数用于直接重构二维离散图像分解细节系数。
实验感悟
数字图像处理这门课虽然只有四周的课时,但却非常重要。大学学这门课只是打基础。这次实验一共10个题目,整个做下来后,对数字图像处理有了大致的了解,也接触了很多Matlab中自带的与图像处理有关的函数,如dctmt_(),imadjust(),histeq()等。同时也了解了这方面的一些常识,如图片的数据类型是uint8,对其处理时要用函20
数转换成double;对图像进行傅变换时,fftshift的作用是让正半轴部分和负半轴部分的图像分别关于各自的中心对称。在程序调试的过程中遇到了很多问题,但百度真是一个强大的搜索引擎,80%以上的错误都可以通过百度来解决。我感觉实验就是锻炼自己遇到问题,分析问题,解决问题的能力,最重要的是要培养自主的解决问题的能力。
Copyright © 2019- hzar.cn 版权所有 赣ICP备2024042791号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务