Matlab 数字图像处理 III:图像算术运算和几何变换
一、 实验目的
1. 掌握算术运算、几何变换的方法;
2. 了解图像算术运算、几何变换在数字图像处理中的初步应用;
3. 观察算法(变换)处理结果,体会图像算术运算和几何变换处理的过程和处理前后图像的变化。
二、 实验原理
1. 图像算术运算:两幅输入图像之间进行的点对点的加、减、乘、除运算后得到输出图像的过程。如果输入图像为A(x,y)和B(x,y),输出图像为C(x,y),则图像的算术运算有如下四种形式:
C(x,y) = A(x,y) + B(x,y)
C(x,y) = A(x,y) – B(x,y)
C(x,y) = A(x,y) * B(x,y)
C(x,y) = A(x,y) / B(x,y)
2. MATLAB图像处理工具箱中的算术运算函数
3. 图像的算术运算函数使用以下截取规则使运算结果符合数据范围的要求:
超出数据范围的整型数据将被截取为数据范围的极值,分数结果将被四舍五入。例如,如果数据类型是uint8,那么大于255的结果(包括无穷大inf)将被设置为255。
三、 实验内容及步骤
1. 图像的加法运算
imadd函数调用格式:Z=imadd(X,Y)
实现:图像+图像,图像+常数
2. 噪声处理
Imnoise函数调用格式:Z=imnoise(X, type, parameter)
type:噪声的类型 parameter:噪声的参数
3. 图像的减法运算(差分方法)
用途:检测图像变化及运动物体,作为许多图像处理工作的准备步骤。
函数调用格式: Z = imsubtract(X,Y)
Z = imabsdiff(X,Y)
实现:图像-图像,图像-常数
4. 图像的乘法运算
用途:
实现掩模操作,即屏蔽掉图像的某些部分;
实现缩放:一幅图像乘以一个常数,如果使用的缩放因子大于1,那么将增强图像的亮度,如果因子小于1则会使图像变暗,效果优于简单添加像素偏移量。
由于时域的卷积或相关运算与频域的乘积运算对应,因此乘法运算有时也被作为一种技巧来实现卷积或相关处理。
immultiply函数调用格式:Z = immultiply(X,Y)
5. 图像的除法运算
用途:
校正成像设备的非线性影响,这在特殊形态的图像(如断层扫描等医学图像)处理中常常用到。
检测两幅图像间的区别——相应像素值的变化比率,而不是每个像素的绝对差异,因而称为比率变换。
imdivide函数的调用格式如下:Z = imdivide(X,Y)
6. 图像的四则运算
函数imlincomb按照双精度执行所有算术运算操作,而且仅对最好的输出结果进行截取,该函数的调用格式如下
Z = imlincomb(A,X,B,Y,C);
其中,Z=A*X+B*Y+C。
MATLAB会自动根据输入参数的个数判断需要进行的运算。例如:
Z = imlincomb(A,X,C) 计算Z=A*X+C:
Z = imlincomb(A,X,B,Y,) 计算Z=A*X+B*Y:
7. 图像的缩放
图像缩放函数imresize调用格式:
B = imresize(A,m)
B = imresize(A,m,method)
B = imresize(A,[mrows ncols],method)
B = imresize(…,method,n)
B = imresize(…,method,h(FIR滤波器))
Method:插值方法
nearest—最近邻插值(默认)
Bilinear—双线性插值
Bicubic—三次卷积插值
8. 图像的旋转
图像旋转函数imrotate调用格式:
B = imrotate(A,angle,method)
B = imrotate(A,angle,method,’crop’)
四、 实验结果
1. 图像的加法运算
实现:图像+图像
A=imread(‘rice.png’)
B=imread(‘testpat1.png’)
C=imadd(A,B)
subplot(1,3,1),imshow(A);subplot(1,3,2),imshow(B);subplot(1,3,3),imshow(C)
实现:图像+/-常数
A=imread(‘cameraman.tif’)
B=A+50
C=A-50
subplot(1,3,1),imshow(A);subplot(1,3,2),imshow(B);subplot(1,3,3),imshow(C)
2. 噪声处理
对图像rice.png分别加入高斯噪声、椒盐噪声和乘性噪声:
A=imread(‘rice.png’)
B=imnoise(A,’gaussian’,0.02)
C=imnoise(A,’salt & pepper’,0.02)
D=imnoise(A,’speckle’,0.02)
subplot(2,2,1),imshow(A) ,title(‘原图’);
subplot(2,2,2),imshow(B) ,title(‘高斯噪声’);
subplot(2,2,3),imshow(C) ,title(‘椒盐噪声’);
subplot(2,2,4),imshow(D) ,title(‘乘性噪声’);
在原图上分别叠加密度为0.01~0.06的椒盐噪声后取平均
A=imread(‘pout.tif’);
B=imnoise(A,’salt & pepper’,0.01);
C=imnoise(A,’salt & pepper’,0.02);
D=imnoise(A,’salt & pepper’,0.03);
E=imnoise(A,’salt & pepper’,0.04);
F=imnoise(A,’salt & pepper’,0.05);
G=imnoise(A,’salt & pepper’,0.06);
H=0.1*B+0.2*C+0.1*D+0.2*E+0.2*F+0.2*G;
subplot(2,4,1),imshow(A) ,title(‘原图’);
subplot(2,4,2),imshow(B) ,title(‘椒盐0.01′);
subplot(2,4,3),imshow(C) ,title(‘椒盐0.02′);
subplot(2,4,4),imshow(D) ,title(‘椒盐0.03′);
subplot(2,4,5),imshow(E) ,title(‘椒盐0.04′);
subplot(2,4,6),imshow(F) ,title(‘椒盐0.05′);
subplot(2,4,7),imshow(G) ,title(‘椒盐0.06′);
subplot(2,4,8),imshow(H) ,title(‘椒盐平均’);
3. 图像的减法运算(差分方法)
A=imread(‘cameraman.tif’)
B =imopen (A, strel(‘disk’,15))
C=imabsdiff(A,B)
subplot(1,3,1),imshow(A);subplot(1,3,2),imshow(B);subplot(1,3,3),imshow(C)
4. 图像的乘法运算
A=imread(‘cameraman.tif’)
B=immultiply(A,0.5)
C=immultiply(A,1.2)
subplot(1,3,1),imshow(A),title(‘原图’);
subplot(1,3,2),imshow(B),title(’0.5′);
subplot(1,3,3),imshow(C),title(’1.2′)
5. 图像的除法运算
A=imread(‘cameraman.tif’)
B =imopen (A, strel(‘disk’,15))
C=imabsdiff(A,B)
D= imdivide(A,C)
subplot(1,3,1),imshow(A),title(‘原图’);
subplot(1,3,2),imshow(C),title(‘减去背景的图像’);
subplot(1,3,3),imshow(D),title(‘原图和减去背景图像相除’)
6. 图像的四则运算
A=imread(‘cameraman.tif’)
B =imopen (A, strel(‘disk’,15))
C=imabsdiff(A,B)
D= imdivide(A,C)
E= imlincomb(0.2,C,0.4,D,12)
subplot(1,3,1),imshow(C),title(‘C’);
subplot(1,3,2),imshow(D),title(‘D’);
subplot(1,3,3),imshow(E),title(’0.2*C+0.4*D+12′)
7. 图像的缩放
A = imread(‘cameraman.tif’)
B = imresize(A,0.5,’nearest’)
C = imresize(A,0.8,’Bilinear’)
D = imresize(A,1.2,’Bicubic’)
figure,imshow(B),title(‘最近邻差值 0.5′);
figure,imshow(C),title(‘双线性插值 0.8′);
figure,imshow(D),title(‘三次卷积插值1.2′)
8. 图像的旋转
A = imread(‘cameraman.tif’)
B = imrotate(A,30, ‘bilinear’,’crop’)
C = imrotate(A,30, ‘bilinear’,’loose’)
subplot(1,3,1),imshow(A),title(‘原图’);
subplot(1,3,2),imshow(B),title(‘crop’);
subplot(1,3,3),imshow(C),title(‘loose’)