MATLAB是一个包含大量计算算法的集合。其拥有600多个工程中要用到的数学运算函数,可以方便的实现用户所需的各种计算功能。函数中所使用的算法都是科研和工程计算中的最新研究成果,而前经过了各种优化和容错处理。在计算要求相同的情况下,使用MATLAB的编程工作量会大大减少。MATLAB的这些函数集包括从最简单最基本的函数到诸如距阵,特征向量、快速傅立叶变换的复杂函数。
图像的几何操作
一、 图像的基本运算
1、 加法运算
图像相加一般用于对同一场景的多幅图像求平均效果,以便有效地降低具有叠加性质的随机噪声。直接采集的图像品质一般都较好,不需要进行加法运算处理,但是对于那些经过长距离模拟通信方式传送的图像(如卫星图像),这种处理是必不可少的。
在MATLAB7.0中,如果要进行两幅图像的加法,或者给一幅图像加上一个常数,可以调用imadd函数来实现。imadd函数将某一幅输入图像的每一个像素值与另一幅图像相应的像素值相加,返回相应的像素值之和作为输入图像。imadd函数的调用格式可参考图像处理的工具箱。下面的程序可将图1两幅图像叠加在一起,叠加效果如图2所示。
imshow('rice.png');
imshow('cameraman.tif');
I=imread('rice.png');
J=imread('cameraman.tif');
K=imadd(I,J,'uint16');%大小必须一样
imshow(K,[])
图1 图2
给图像的每一个像素加上一个常数可以使图像的亮度增加。例如以下程序示例的处理效果如图3所示。
I=imread('rice.png');
J=imadd(I,50);
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(J);
图3
2、 减法运算
图像减法也称为差分方法,是一种常用于检测图像变化及运动物体的图像处理方法。图像减法可以作为许多图像处理过程的准备步骤。例如,可以使用图像减法来检测一系列相同场景图像的差异。图像减法与阈值化处理的综合使用通常是建立机器视觉系统最有效的方法之一。当然,在利用图像减法处理图像时,往往需要考虑背景的更新机制,尽量补偿因天气、光线等因素对图像显示效果造成的影响。
在MATLAB7.0中,使用imsubtract函数可以将一幅图像从另一幅图像中减去,或者从一幅图像中减去一个常数。imsubtract函数将一幅输入图像的像素值从另一幅输入图像相应的像素值中减去,再将相应的像素值之差作为输出图像相应的像素值。以下的程序代码示例首先根据原始图像生成其背景亮度图像,然后再从原始图像中将背景亮度图像减去,从而生成如图4所示的图像。
I=imread('rice.png');
blocks=blkproc(I,[32 32],'min(x(:))');%背景
background=imresize(blocks,[256 256],'bilinear');
Ip=imsubtract(I,background);
imshow(Ip,[])
图4
3、 乘法运算
两幅图像进行乘法运算可以实现掩模操作,即屏蔽掉图像的某些部分。一幅图像乘以一个常数通常被称为缩放,这是一种常见的图像处理操作。如果使用的缩放因数大于1,那么将增强图像的亮度,如果因数小于1则会使图像变暗。缩放操作通常将产生比简单添加像素便宜量自然得多的明暗效果。这是因为该操作能够更好的维持图像的相关对比度。此外,由于时域的卷积或相关运算与频域的乘积运算对应,因此乘法运算有时也作为一种技巧来实现卷积或相关处理。
在MATLAB7.0中,可以使用immultiply函数实现两幅图像的乘法。immultiply函数将两幅图像相应的像素值进行元素对元素的乘法操作,并将乘法的运算结果作为输出图像相应的像素值。例如,以下程序示例将使用给定的缩放因数对图5所示的图像进行缩放,从而得到如图6所示的较为明亮的图像。
I=imread('moon.tif');
I16=uint16(I);
J=immultiply(I16,I16);
imshow(I),figure,imshow(J)
图5 缩放前 4、 除法运算
图6 缩放后
除法运算可用于校正成像设备的非线性影响,这在特殊形态的图像(如断层扫描等医学图像)处理中经常用到。图像除法也可以用来检测两幅图像间的区别,但是除法操作给出的是相应像素值的变化比率,而不是每个像素的绝对差异,因而图像除法操作也称为比率变换。
在MATLAB7.0中,可以使用imdivide函数进行两幅图像的除法。imdivide函数对两幅输入图像的所有相应像素执行元素对元素的除法操作(点除),并将得到的结果作为输出图像的相应像素值。以下程序代码示例将图7的两幅图进行除法操作,得到如图8所示的效果图。
I=imread('rice.png');
blocks=blkproc(I,[32 32],'min(x(:))');
background=imresize(blocks,[256 256],'bilinear');
Ip=imdivide(I,background);
imshow(Ip,[]) %相除后
figure
I=imread('rice.png');
I16=uint16(I);
J=immultiply(I16,I16);
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(J);%两张相除
a 图像一 b 图像二
图7 两幅待相除的图像 图8 相除后的图像
二、 图像的插值运算
MATLAB7.0中的imresize函数和imrotate函数用于二维图像的差值运算,MATLAB7.0的图像处理工具箱提供了3种插补方法:
近邻(nearest neighbor)插值
双线性(bilinear)插值
双立方(bicubic)插值
这三种插补方法的运算方式基本类似。对于每种插补方法,为了确定插值像素点的数据值,用户必须在输入图像中查找到与输出像素相应的点。但是上述三种插值方法的主要区别在于其对像素点赋值内容的不同:
对于近邻插值来说,输出像素的赋值为当前点的像素点。
对于双线性插值来说,输出像素的赋值为2*2矩阵所包含的有效点的加权平均值。
对于双立方插值来说,输出像素的赋值为4*4矩阵所包含的有效点的加权平均值。
三、 调整图像的大小
改变图像的大小可用imresize函数来调整。imresize函数主要特点有:
可以指定输出图像的大小。
可以指定插值方法。
可以指定滤波器来阻止混淆。
1、 指定输出图像的大小
指定输出图像大小的方法有两种:一是指定放大因子,二是指定输出图像的维数。以下程序代码示例用指定放大因子的方法说明imresize函数的使用用法,并将原图像放大了1.25倍,其效果如图9所示。
a 改变前
b 改变后
图9 图像大小改变前、后的效果对比
2、 指定插值方法
在默认的情况下,imresize函数可用最近邻插值法来指定输出图像的像素值。当然,也可以指定其他的插值方法,以下命令行用imresize函数指定了双线性插值方法。
Y=imresize(X,[100 150],’bilinear’)
四、 图像的旋转
可通过imrotate函数来旋转图像。imrotate函数主要包括两个参数:需要旋转的图像和旋转的角度。如果指定一个正的旋转角度,那么imrotate函数将使用指定的插值方法和旋转角度将图像逆时针旋转;如果指定一个负值,那么将按顺时针方向旋转。如果命令中没有指定插补方法,则函数采用默认的最近邻插补方法。例如以下的程序代码示例将ic.tif图像旋转35°,其旋转效果如图10所示。
I=imread('circuit.tif');
J=imrotate(I,35,'bilinear');
imshow(I);
figure,imshow(J);
a 旋转前 b 旋转后
图10 图像旋转前、后的显示效果比较
五、 实验报告要求:
1、 说明利用MATLAB图像处理工具箱进行图像的加、减、乘、除处理的方法;
2、 (作业)不调用函数,自行编写代码实现二维图像的放大与旋转并记录结果图像。
提交:
① 放大(基于像素放大原理)
A=imread('C:\\Documents and Settings\\Administrator\\桌面\\matlab\\logo.tif')
B=zeros(320,320)
x=1.2
>> for i=1:1:round(x*107);
for j=1:1:round(x*122);
B(i,j)=A(round(i/x),round(j/x));
end
end
>> imshow(B)
② 旋转
A=imread('C:\\Documents and Settings\\Administrator\\桌面\\matlab\\logo.tif')
y=pi/6%角度
a=zeros(107,122)%矩阵i
for i=1:1:107;
for j=1:1:122;
a(i,j)=i;
end
end
aa=zeros(107,122)%i`
for i=1:1:107;
for j=1:1:122;
aa(i,j)=round(i*cos(y)-j*sin(y));
end
end
aa=aa+61%调整
b=zeros(107,122)%矩阵j
for i=1:1:107;
for j=1:1:122;
b(i,j)=j;
end
end
bb=zeros(107,122)%j`
for i=1:1:107;
for j=1:1:122;
bb(i,j)=round(i*sin(y)+j*cos(y));
end
end
G=zeros(153,159)%扩展画布
for i=1:1:107;
for j=1:1:122;
m=aa(i,j);
n=bb(i,j);
G(m,n)=A(i,j);
end
end
%去空穴
>> for m=2:1:152;
for n=2:1:158;
if(G(m,n)==0)
G(m,n)=(G(m-1,n)+G(m+1,n)+G(m,n-1)+G(m,n+1))/4;
end
end
end
>> figure,imshow(G)
%写入:
>> imwrite(G,'C:\\Documents and Settings\\Administrator\\桌面\\matlab\\g','tif')
imshow('C:\\Documents and Settings\\Administrator\\桌面\\matlab\\g.tif')
因篇幅问题不能全部显示,请点此查看更多更全内容