欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图像的几何变换

程序员文章站 2022-03-31 11:30:19
...

图片的几何变换

几何变换不改变图像的像素值,只是在图像平面上进行像素的重新安排。一个几何变换需要两部分运算:首先是空间变换所需要的运算,如平移旋转和镜像等,需要用它来表示输出图像和输入图像之间的(像素)映射关系;此外,还需要使用弧度插值算法,因为按照这种变换关系进行计算输出图像的像素可能被映射到输入图像的非整数坐标上。

图像平移

matlab编程实现

A=imread('girl.bmp');           %读入图像
%strel  用来创建形态学结构元素
%translate(SE, [y,x])在原结构元素SE上进行y和x方向的偏移
%参数[80  50]可以修改,修改后平移距离对应改变
se=translate(strel(1),[80 50]);

%imdilate  形态学膨胀
B=imdilate(A,se);

figure;
subplot(1,2,1),subimage(A);
title('原图像');
subplot(1,2,2),subimage(B);
title('图像平移');

图像镜像

matlab编程实现:

Imtransform()函数用于一般的二维空间变换,形式如下:

B=imtransform(A,TFORM,method);
  • 参数A为要进行集合变换的图像。
  • 空间变换结构TFORM指定了具体的变换类型。
  • 可选参数method允许为imtransform()函数选择的插值方法,‘bicubic’——三次插值,‘bilinear’——双线性插值,‘nearest’——最近邻插值。

函数输出B为经imtransform()变换后的目标图像;

可以通过两种方法来创建TFORM结构,即使用marketform()函数和cp2tform()函数。cp2tform()函数是一个数据拟合函数,它需要原图像和目标图像之间的对应点对儿作为输入,用来确定基于点对儿的几何变换关系,

T=maketform(transformtype,Matrix);
  • 参数transformtype指定了变换的类型,如常见的’affine’为二维或多维仿射变换,包括平移,旋转,比例,拉伸和错切等。
  • Matrix为相应的仿射变换矩阵
A=imread('girl.bmp');
[height,width,dim]=size(A);
tform=maketform('affine',[-1 0 0;0 1 0;width 0 1]);
%定义水平镜像变换矩阵
B=imtransform(A,tform,'nearest');
tform2=maketform('affine',[1 0 0;0 -1 0;0 height 1]);
%定义竖直镜像变换矩阵
C=B=imtransform(A,tform2,'nearest');

图像转置

matlab程序实现:

A=imread('girl.bmp');
[height,width,dim]=size(A);
tform=maketform('affine',[0 1 0;1 0 0;0 0 1]);
%定义转置变换矩阵
B=imtransform(A,tform,'nearest');

图像缩放

MATLAB提供了专门的图像缩放函数imresize(),具体形式如下:

B=imresize(A,Scale,method);
  • 参数A为要进行缩放的原始图像。
  • Scale为统一的缩放比例。
  • 可选参数method用于为imresize()函数指定的插值方法,其合法取值同imtransform()函数,但默认是最近邻插值。

输出B是缩放后的图像。

A=imread('girl.bmp');
B=imresize(A,1.2,'nearest');
%图像扩大1.2倍

如果希望在x和y方向上以不同的比例进行缩放,可使用如下方法调用inresize()函数。

B=imresize(A,[mrows,ncols],method);

向量参数[mrows,ncols]指明变换后目标像B的具体行数(高)和列数(宽),其余均与等比例缩放时的调用相同,

图像旋转

MATLAB专门提供了围绕图像中心的旋转变换函数imrotate(),其调用方式如下

B=imrotate(A,angle,method,'crop');
  • A是要旋转的图像
  • angle是要旋转的角度,单位为度,如果是一个正值的话,则按逆时针旋转。
  • method为指定的插值方法
  • 'crop’选项会裁剪旋转增大的图像,使得到的图像和原图的大小一致。

空间域图像增强

滤波

滤波函数imfilter()的原型如下:

q = imfilter(f,w,options,...)

或者可以写成:

 g = imfilter(f, w, filtering_mode, boundary_options, size_options)

参数说明:

  • f是要进行滤波操作的图像;
  • w是滤波操作所使用的模板,为一个二维数组;
  • filtering_mode 用于指定在滤波过程中是使用“相关”还是“卷积”。 boundary_options 用于处理边界充零问题,边界的大小由滤波器的大小确定。具体参数选项见下表:
选项 描述
filtering_mode ‘corr’ 通过使用相关来完成,该值为默认。
‘conv’ 通过使用卷积来完成
boundary_options ‘X’ 输入图像的边界通过用值X(无引号)来填充扩展 其默认值为0
‘replicate’ 图像大小通过复制外边界的值来扩展
‘symmetric’ 图像大小通过镜像反射其边界来扩展
‘circular’ 图像大小通过将图像看成是一个二维周期函数的一个周期来扩展
size_options ‘full’ 输出图像的大小与被扩展图像的大小相同
‘same’ 输出图像的大小与输入图像的大小相同。这可通过将滤波掩模的中心点的偏移限制到原图像中包含的点来实现,该值为默认值。
f=imread('cameraman.tif');
imshow(f);
w=[1 1 1;1 1 1;1 1 1]/9;
g=imfilter(f,w,'corr','replicate');

可创建预定义的二维滤波器的fspecial()函数的常见调用格式如下;

h=fspecial(type,parameters);
  • 参数type制定了滤波器的类型
  • 可选输入parameters是和所选定的滤波器类型type相关的配置参数,如尺寸和标准差等,如果不提供则函数使用该类型的默认参数配置
  • 返回值h为特定的滤波器

图像平滑

利用imfilter()和fspecial(),来实现

I=imread('baby_noise.bmp');
figure;
imshow(I)
h=fspecial('average',3);    %3*3的平均模板
I3=imfilter(I,h,'corr','replicate');
figure;
imshow(I3)

高斯滤波

平均滤波对于领域内的像素都是一视同仁的,为了减少平滑处理中的模糊,得到更加自然的平滑效果,很自然地想到适当加大模板中心点的权重,随着距离中心点的距离增大,权重迅速减小,从而可以确保中心点看起来更接近于与他距离更近的点,基于这样的考虑得到的模板即为高斯模板。

I=imread('baby_noise.bmp');
figure;
imshow(I)
h=fspecial('gaussian',3,0.5);    % sigma=0.5的3*3高斯模板
I3=imfilter(I,h);
figure;
imshow(I3)

中值滤波

噪声模型

MATLAB中为图片添加噪声的语句代码是:

J=imnoise(I,type,parameters);

中值滤波的实现

MATLAB提供了medfilt2()函数实现中值滤波,原型如下:

I2=medfilt2(I1,[m,n]);

图像锐化

图像锐化主要是用于增强图像的灰度跳变部分,这一点与图像平滑对灰度跳变的抑制刚好相反。事实上从平滑与锐化的两种运算算子上也能说明这一点,线性平滑都是基于对图像领域的加权求和或者积分运算的,而锐化则通过其逆运算导数(梯度)或者说有限差分来实现。

一阶Robert交叉梯度

Robert交叉梯度对应的模板如下:

w1=[-1 0;01]

w2=[0 -1;1 0]

其中w1对接近45度边缘有着较强的响应,w2对接近-45度边缘有着较强的响应

I=imread('bactria.bmp');
imshow(I);
I=double(I);    %转换为double类型,这样可以保存负值,否则uint8类型会把负值裁掉
w1=[-1 0;01];
w2=[0 -1;1 0];
G1=imfilter(I,w1,'corr','replicate');  %以重复方式填充边界    也可以采用symmetric的对称填充方式
G2=imfilter(I,w2,'corr','replicate');
G=abs(G1)+abs(G2);      %计算Robert梯度
figure, imshow(G, []);
figure, imshow(abs(G1), [ ]);
figure, imshow(abs(G2), [ ]);

为了观察效果,将图像的灰度变换范围线性变换到0-255之内,并使得图像得最小灰度值为0,最大灰度值为255.在matlab中只需要使用imshow()函数显示图像的时候加上一个参数[ ]即可。

一阶Sobel梯度

I=imread('bacteria.bmp');
imshow(I);
I=double(I);
[Gx,Gy]=gradient(I);      %计算x和y方向的梯度
G=abs(Gx)+abs(Gy);      %计算整体梯度
figure,imshow(G, [ ]);
figure,imshow(Gx, [ ]);     %x方向梯度图像(突显偏竖直方向的边缘 )
figure,imshow(Gy, [ ]);      %y方向梯度图像(突显偏水平方向的边缘 )

基于二阶微分的图像增强——拉普拉斯算子

对于图像的锐化而言应用更为广泛的基于二阶微分的拉普拉斯算子

对应三种滤波模板如下:

w1=[0 1 0;1 -4 1;0 1 0];

w2=[-1 -1 -1;-1 8 -1;-1 -1 -1];

w3=[1 4 1;4 -20 4;1 4 1];

对应的matlab代码如下:

I=imread('bacteria.bmp');
figure,imshow(I);
I=double(I);
w1=[0 1 0;1 -4 1;0 1 0];
L1=imfilter(I,w1,'corr','replicate');
w2=[-1 -1 -1;-1 8 -1;-1 -1 -1];
L2=imfilter(I,w2,'corr','replicate');
w3=[1 4 1;4 -20 4;1 4 1];
L3=imfilter(I,w3,'corr','replicate');
figure,imshow(L1);
figure,imshow(L2);
figure,imshow(L3);

基于一阶和二阶导数的锐化算子的比较

  • 一阶导数通常会产生较宽的边缘。
  • 二阶导数对于阶跃型边缘中心产生零交叉,而对于屋顶状边缘(细线),二阶导数取极值。
  • 二阶导数对于细节有较强的响应,如细线和孤立的噪点。

高斯—拉普拉斯变换

锐化在增强边缘和细节的同时往往也会增强噪音,因此如何区分开噪声和边缘是锐化中要解决的一个问题。

基于二阶微分的拉普拉斯算子对于细节(细线和孤立的点)能产生很强的响应,并且各向同性,因此在图像增强中较一阶的梯度算子更受到读者的青睐。然而,他对于噪声点的响应也更强,可以看到对于图像baby_noise.bmp,经过拉普拉斯锐化后噪声更加的明显了。

为了取得更好的锐化效果的同时吧噪声的干扰降到最低,可以先对带有噪声的原始图像进行平滑滤波,再进行锐化增强边缘和细节。本着“强强联合”的原则,将在平滑领域工作更好的高斯平滑算子同锐化界变现突出的拉普拉斯锐化结合起来,得到高斯—拉普拉斯算子。

MATLAB实现

I=imread('baby.bnp');
figure, imshow(I);
Id=double(I);
h_lap=[-1 -1 -1;-1 8 -1;-1 -1 -1]      %拉普拉斯算子
I_lap=imfilter(Id, h_lap, 'corr', 'replicate')     %laplacian锐化
figure, imshow(uint8(abs(I_lap)), [ ]);        %取绝对值并将255以上的响应截断,

h_log=fspecial('log', 5, 0.5);      %大小为5, sigma=0.5的LoG算子
I_log=imfilter(Id, h_log, 'corr', 'replicate');
figure, imshow(uint8(abs(I_lap)), [ ]);