图像的几何运算
@
图像的几何运算是指引起图像几何形状发生改变的变换。与点运算不同的是,几何运算可以看成是像素在图像内的移动过程,该移动过程可以改变图像中物体对象之间的空间关系。
1.图像的插值
图像插值是指利用已知邻近像素点的灰度值来产生位置像素点的灰度值,以便由原始图像再生成具有更高分辨率的图像。插值是在不生成新的像素的情况下对原图像的像素重新分布,从而改变像素数量的一种方法。在图像放大过程中,像素也相应的增加,增加的过程就是‘插值’发生作用的过程,‘’插值程序自动选择信息较好的像素作为增加、弥补空白像素的空间,而并非只使用近邻的像素,所以在放大图像时,图像看上去会比较平滑、干净。无论使用何种插值方法,首先都需要找到与输出图像像素相对应的输入图像点,然后再通过计算该点附近某一像素集合的权平均值来指定输出像素的灰度值。像素的权是根据像素到点的距离来而定的,不同插值方法的区别就在于考虑的像素集合不同。最常见的插值方法如下:
(1)向前映射法:
通过输入图像像素的位置,计算输出图像对应像素的位置,将该位置像素的灰度值按某种方式分配到输出图像相邻的四个像素。
(2)向后映射法:
通过输出图像像素位置,计算输入图像对应像素的位置,根据输入图像相邻四个像素的灰度值计算该位置像素的灰度值。
(3)最近邻插值:
表示输出像素将被指定为像素点所在位置处的像素值。
(4)双线性插值:
表示输出像素值是像素2×2邻域内的平均值。
(5)双三次插值:
表示输出像素值是像素4×4邻域内的权平均值。
在MATLAB中,interp2函数用于对图像进行插值处理,该函数的调用方法如下:
A=interp2(X,Y,Z,IX,IY):Z为要插值的原始图像,IX和IY为图像的新行和新列
clear all
close all
clc
I2=imread('eight.tif');
subplot(231)
imshow(I2)
title('原始图像')
Z1=interp2(double(I2),2,'nearest');%最近邻插值法
Z1=uint8(Z1);
subplot(232)
imshow(Z1)
title('最近邻插值')
Z2=interp2(double(I2),2,'linear');%线性插值法
Z2=uint8(Z2);
subplot(232)
imshow(Z2)
title('线性插值法')
Z3=interp2(double(I2),2,'spline');%三次样条插值法
Z3=uint8(Z3);
subplot(234)
imshow(Z3);
title('三次样条插值');
Z4=interp2(double(I2),2,'cubic');%立方插值法
Z4=uint8(Z4);
subplot(235);
imshow(Z4);
title('立方插值')
2.旋转与平移变换
旋转变换的表达式为
用齐次矩阵表示为
在MATLAB中,使用imrotate函数来旋转一幅图像,调用格式如下:
B=imrotate(A,ANGLE,METHOD,BBOX)
其中,A是需要旋转的图像;ANGLE是旋转的角度,正值为逆时针;METHOD是插值方法;BBOX表示旋转后的显示方式。
图像的平移变换所用到的是直角坐标系的平移变换公式
其中x,y表示矩阵的行列方向。
对图像实现旋转变换
clear all
clc
close all
[A,map]=imread('autumn.tif');
J=imrotate(A,40,'bilinear');
subplot(121)
imshow(A,map);
title('原始图像')
subplot(122)
imshow(J,map)
title('旋转后的图像')
使用不同的插值方法对图像进行旋转
clear all
close all
clc
[I,map]=imread('trees.tif');
J=imrotate(I,35,'bilinear');
J1=imrotate(I,35,'bilinear','crop');%采用双线性插值法,对图像进行水平旋转
J2=imrotate(I,35,'nearest','crop');%采用最近邻插值法,对图像进行水平旋转
J3=imrotate(I,35,'bicubic','crop');%采用双立方插值法,对图像进行水平旋转
subplot(231)
imshow(I,map)
title('原始图像')
subplot(232)
imshow(J,map)
title('双线性插值')
subplot(233)
imshow(J1,map)
title('双线性插值')
subplot(234)
imshow(J2,map)
title('最近邻插值')
subplot(235)
imshow(J3,map)
title('双立方插值')
对图像进行平移
clear all
close all
clc
A=imread('office_4.jpg');
subplot(121)
imshow(A)
title('原始图像')
A=double(A);
A_move=zeros(size(A));
H=size(A);
A_x=50;
A_y=50;
A_movesult(A_x+1:H(1),A_y+1:H(2),1:H(3))=A(1:H(1)-A_x,1:H(2)-A_y,1:H(3));
subplot(122)
imshow(uint8(A_movesult))
title('平移后的图像')
3.缩放与裁剪变换
图像的缩放是指在保持原有图像形状的基础上,对图像进行放大或缩小。若在x方向缩放c倍,在y方向缩小d倍,则用齐次矩阵表示为
在MATLAB中,imresize函数用于改变一幅图像的大小,该函数的调用格式如下
B=imresize(A,M,METHOD)
其中,A是原图像;M为缩放系数;B为缩放后的图像;METHOD为插值方法,可取值‘nearest’,‘bilinear’和‘bicubic’。
图像上的裁剪是指将图像不需要的部分切除,只保留感兴趣的部分。在MATLAB中,imcrop函数用于从一幅图像中抽取一个矩形的部分,该函数的调用格式如下:
I2=imcrop(I):表示交互式地对灰度图像进行剪切,显示图像,允许用鼠标指定裁剪矩形。
X2=imcrop(X,map):表示交互式地对索引图像进行剪切,显示图像,允许用鼠标指定裁剪矩形。
RGB2=imcrop(RGB):表示交互式地对真彩图像进行剪切,显示图像,允许用鼠标指定裁剪矩形。
I2=imcrop(I,rect):表示非交互式地对指定灰度图像进行剪裁,按照指定的矩阵框rect剪切图像,rect四元素向量[xmin,ymin,width,height],分别表示举行的左下角和长度及宽度,这些值在空间坐标中指定。
X2=imcrop(X,map,rect):表示非交互式地对索引图像进行剪裁。
RGB2=imcrop(RGB,rect):表示非交互式地对真彩图像进行剪裁。
clear all
close all
clc
I=imread('football.jpg');
figure;
subplot(131)
imshow(I)
title('原始图像')
I=double(I);
I_en=imresize(I,4,'nearest');%最近邻法标志函数nearest扩大4倍
subplot(132)
imshow(uint8(I_en))
title('扩大4倍后的图像')
I_re=imresize(I,0.5,'nearest');
subplot(133)
imshow(uint8(I_re))
title('缩小2倍后的图像')
下面利用不同的方法对图像进行缩放
clear all
clc
close all
i=imread('pout.tif');
j=imresize(i,0.5);
j1=imresize(i,2.5);
j2=imresize(i,0.05,'nearest');%利用不同的方法对图像进行缩放
j3=imresize(i,0.05,'bilinear');
j4=imresize(i,0.05,'bicubic');
subplot(231)
imshow(i)
subplot(232)
imshow(j)
subplot(233)
imshow(j2)
subplot(234)
imshow(j1)
subplot(235)
imshow(j3)
subplot(236)
imshow(j4)
手动裁剪图像
clear all
clc
close all
[I,map]=imread('trees.tif');
figure
subplot(121)
imshow(I)
[I2,map]=imcrop(I,map);
subplot(122)
imshow(I2)
指定剪切区域大小和位置,对图像进行剪切
clear all
clc
close all
[I,map]=imread('trees.tif');
figure
subplot(121)
imshow(I)
%指定剪切区域的大小和位置,剪切图像,并返回坐标(x,y)和剪切区域rect
[x,y,I2,rect]=imcrop(I,map,[75 68 130 112]);
subplot(122)
imshow(I2)
x,y,rect
4.镜像变换
镜像变换的特点是左右颠倒或者上下颠倒,图像的镜像分为水平镜像和垂直镜像两种。
水平镜像计算公式为
由于表示图像的矩阵坐标必须非负,因此需要在进行镜像计算之后,再进行坐标平移。
垂直镜像计算公式为
由于表示图像的矩阵坐标必须非负,因此需要在进行镜像计算之后,再进行坐标平移。
在MATLAB中,flipud函数用于实现对图像的上下翻转;fliplr函数用于实现对图像的左右翻转。
对图像的镜像变换。
clear all
clc
close all
I=imread('office_4.jpg');
figure
subplot(221)
imshow(I)
title('原始图像')
I=double(I);
h=size(I);
I_fliplr(1:h(1),1:h(2),1:h(3))=I(1:h(1),h(2):-1:1,1:h(3));%水平镜像旋转
I1=uint8(I_fliplr);
subplot(222)
imshow(I1)
title('水平镜像变换')
I_flipud(1:h(1),1:h(2),1:h(3))=I(h(1):-1:1,1:h(2),1:h(3));%垂直镜像变换
I2=uint8(I_flipud);
subplot(223)
imshow(I2)
title('垂直镜像变换')
I_fliplr_flipud(1:h(1),1:h(2),1:h(3))=I(h(1):-1:1,h(2):-1:1,1:h(3));%对角镜像变换(先水平变换再垂直变换)
I3=uint8(I_fliplr_flipud);
subplot(224)
imshow(I3)
title('对角镜像变换')