用Skimage学习数字图像处理(007):图像的几何变换(下)

本文详细介绍了图像几何变换中的五种基本变换,包括平移、旋转变换、镜像变换、错切变换以及仿射变换。重点讲解了这些变换的原理、公式和在Skimage库中的实现方法,为初学者提供了Python图像处理的基础知识。
摘要由CSDN通过智能技术生成

本节将介绍与图像几何变换相关的内容,主要涉及到五种常见的图像二维几何变换:平移、镜像、旋转、错切和放缩。本节是下篇,介绍图像的平移、镜像、旋转和错切变换,它们可以归为一种典型的二维空间综合几何变换,即仿射变换(Affine Transform)。

目录

4.2 其他基本变换

4.2.1 平移变换

4.2.2 旋转变换

4.2.3 镜像变换

4.2.4 错切变换

4.3 复合变换

4.3.1 等距变换

4.3.2 相似变换

4.3.3 仿射变换

4.3.4 综合实例


(各类基本变换图示)

4.2 其他基本变换

4.2.1 平移变换

平移(translation)是物体位置在水平和垂直方向的移动,是一种最基础的。图像的平移变换指的是图像中所有像素的坐标进行水平或垂直方向的移动,即将所有像素点按照指定的平移量在水平方向上(对应x轴)和垂直方向上(对应y轴)进行位移。

平移变换可用以下公式描述:

\begin{bmatrix}x'\\ y'\\ 1\end{bmatrix}=M_T\begin{bmatrix} x\\ y \\ 1\end{bmatrix}, \quad M_T=\begin{bmatrix}1 & 0 & d_x\\ 0 & 1&d_y \\ 0 & 0 & 1\end{bmatrix}

式中,(x,y)(x',y')分别表示变换前后的坐标值,M_T表示平移变换,其中d_xd_y分别表示在x和y方向上的平移量。

4.2.2 旋转变换

图像有两种旋转方式:原点旋转中心旋转

图像以原点(0,0)为中心、顺时针旋转角度\theta进行旋转(Rotation)操作,可以由以下公式描述:

\begin{bmatrix} x'\\ y' \\ 1\end{bmatrix}=M_{R1}\begin{bmatrix} x\\ y \\ 1\end{bmatrix}, \quad M_{R1}=\begin{bmatrix}\cos \theta & -\sin \theta & 0\\ \cos \theta & \sin \theta &0 \\ 0 & 0 & 1\end{bmatrix}

图像以任意点(x_0, y_0)为旋转中心、顺时针旋转角度\theta的旋转操作,可以先将原点平移到旋转中心(x_0, y_0),然后按照原点旋转,最后再平移回坐标原点,可以由以下公式描述:

\begin{bmatrix} x'\\ y' \\ 1\end{bmatrix}=M_{R2}\begin{bmatrix} x\\ y \\ 1\end{bmatrix}=\begin{bmatrix}1 & 0 & x_0\\ 0 & 1 & y_0 \\ 0 & 0 & 1\end{bmatrix}\begin{bmatrix}\cos \theta & -\sin \theta & 0\\ \cos \theta & \sin \theta &0 \\ 0 & 0 & 1\end{bmatrix} \begin{bmatrix}1 & 0 & -x_0\\ 0 & 1 & -y_0 \\ 0 & 0 & 1\end{bmatrix}\begin{bmatrix} x\\ y \\ 1\end{bmatrix}

4.2.3 镜像变换

镜像(Mirror)也称翻转(Flip),是指将图像沿轴线进行轴对称变换。水平镜像是将图像沿垂直中轴线进行左右翻转,垂直镜像是将图像沿水平中轴线进行上下翻转,水平垂直镜像是水平镜像和垂直镜像的叠加。

以水平镜像为例,图像宽度为 fw,像素点 (x,y) 以垂直中轴线为中心进行左右对换,可以由以下公式描述:

\begin{bmatrix} x'\\ y' \\ 1\end{bmatrix}=M_{HF}\begin{bmatrix} x\\ y \\ 1\end{bmatrix}=\begin{bmatrix}-1 & 0 & f_w\\ 0 & 1 &0 \\ 0 & 0 & 1\end{bmatrix}\begin{bmatrix} x\\ y \\ 1\end{bmatrix}

式中,M_{HF}表示水平镜像变换矩阵。

同理,可得到垂直镜像变换矩阵M_{VF}:

M_{VF}=\begin{bmatrix}1 & 0 & 0\\ 0 & -1 &f_h \\ 0 & 0 & 1\end{bmatrix}

(镜像变换的示例,坐标原点位于图像左上角,向下为x轴正方向,向左为y轴正方向)

4.2.4 错切变换

错切变换(Shear)是指图形沿坐标方向产生不等量的移动而引起图形变形的变换。

水平和垂直方向的错切变换M_{HS}M_{VS}分别定义为:

M_{HS}=\begin{bmatrix}1 & Sy & 0\\ 0 & 1 &0 \\ 0 & 0 & 1\end{bmatrix},\quad M_{VS}=\begin{bmatrix}1 & 0 & 0\\ S_x & 1 &0 \\ 0 & 0 & 1\end{bmatrix}

生活中一种典型的基于错切变换的应用是停车场的折叠闸机,放下时是长方形,抬起时通过错切变换变成平行四边形的形状。

(停车场的闸机,右侧是正常状态,左侧变为错切变形状态)

4.3 复合变换

将前面介绍的放缩、平移和旋转等基本变换的组合,可以得到更复杂的变换,称之为复合变换。

  • 如平移和旋转变换都不会改变任意两点之间的欧式距离,它们的组合称为“等距变换”(又称为“欧式变换”或“刚体变换”)。等距变换只改变物体的方向和位置,不改变形状
  • 在欧式变换的基础上,再加上均匀放缩变换,可得到“相似变换”(SimilarityTransform),请注意此处强调的均匀放缩变换要求各个维度上的放缩因子是相同的。
  • 如果在不强调放缩变换时各个维度放缩因子的一致性,则可进一步得到“仿射变换”(Affine Transformation)。仿射变换保持了二维图像的“平直性”和“平行性”,具体深层含义可查阅参考文献。
  • 上述变换都属于二维平面变换,即变换前后的图像都在同一个平面上,除此之外,还有一种变换,可以完成将图像从所在平面映射到另外一个平面,透视变换就是能够完成这种功能的一种变换方式。但本节只讨论几种平面变换,不再单独介绍透视变换,读者可自行查阅相关文献。

下图所示为几种复合变换的包含关系图。不难考看,从包含关系而言,各类变换共分为4层,由高到低分别是:投射层、仿射层、以及似型变换和线性变换同属一层,最后面一层是刚体变换。

(复杂变换关系图)

4.3.1 等距变换

前面提到,等距变换由平移和旋转两种基本变换组合而成,因此等距变换矩阵M_{E}可以看作是旋转矩阵(M_R)与平移矩阵(M_T)的组合。它共包含三个参数,即一个旋转角 参数\theta,以及两个平移量参数(t_x, t_y))。由于等效变换矩阵有三个未知数,因此一般情况下至少需要知道2组点对应的4个方程来求解M_{E}

在Skimage中用EuclideanTransform函数完成等距变换矩阵的设定。

看一下EuclideanTransform函数的声明:

EuclideanTransform(matrix, rotation, translation, dimensionality)

部分参数说明

  • matrix:(D+1)*(D+1)大小的矩阵, 对应单应变换矩阵。

  • rotation:旋转的角度(顺时针,用弧度表示),实型。
  • translation各坐标轴的平移量,实型。

  • dimensionality:变换的维数,整型

在此给出EuclideanTransform函数的链接,请读者自行查阅。

需要说明的是,在设定EuclideanTransform的变换参数时,有两种设置方式:第一种是单独设定旋转角度和平移量等两个参数;第二种是直接设定变换矩阵,此时后面三个参数不需要单独设定。

比如,旋转角度为顺时针30°,平移量为(100,-50),则使用第一方式时,使用下面一段代码

from skimage import data
from skimage import transform
from skimage import img_as_float

tform = transform.EuclideanTransform(
   rotation=np.pi/6,
   translation = (100, -50)
   )

如果采用第二种方式,则需要将变换矩阵M_R的全部9个参数。

matrix = np.array([[np.cos(np.pi/6), -np.sin(np.pi/6), 100],
                   [np.sin(np.pi/6), np.cos(np.pi/6), -50],
                   [0, 0, 1]])
tform = transform.EuclideanTransform(matrix)

在Skimage中,使用warp函数将变换矩阵tform用于图像变换。

warp函数生成欧式变换矩阵

看一下warp函数的声明:

warp(image, inverse_map, map_args, output_shape, order, mode, cval, clip, preserve_range=)

部分参数说明

  • inverse_map:等距变换矩阵。
  • output_shape:输出形状,元组,[行数,列数]。
  • order:整型(0~5) 可选项,指定插值方式,默认是1(双线性插值)。
  • mode:边界延拓方式,如‘constant’(常值), ‘edge’(边缘), ‘symmetric’(对称), ‘reflect’(反射), ‘wrap’(缠绕)

  • cval:如果延拓方式设为常值,则该参数对应该常数值,可选项。

返回值

  • warped:变换后的图像,实型。

在此给出warp函数的链接,请读者自行查阅。

给出一段基于上述函数,完成对载入图像的平移和旋转变换。

img = img_as_float(data.chelsea())
tf_img = transform.warp(img, tform.inverse)

plt.figure(figsize=(6,4))
plt.rcParams['font.sans-serif'] = ['KaiTi']  
plt.subplot(121), plt.imshow(img ), plt.title("原图"),plt.axis('off')
plt.subplot(122), plt.imshow(tf_img), plt.title("变换图像"),plt.axis('off')
plt.tight_layout()

处理结果如下:

4.3.2 相似变换

相对于等距变换,相似变换多了一个自由度,即尺度。它有4个自由度,即旋转角θ、x和有两个方向上的平移量,以及一个缩放尺度因子。因此,为了求解相似变换矩阵,仍然需要2组点,一共4个方程来求解。需要说明的是,相似变换中水平和垂直两个方向上的缩放因子是相等的,我们将这种情况称为“均匀缩放”。

在Skimage中,使用SimilarityTransform函数完成相似变换矩阵的设定。

SimilarityTransform函数生成欧式变换矩阵

看一下SimilarityTransform函数的声明:

SimilarityTransform(matrix, scale, rotation, translation, imensionality)

部分参数说明

  • matrix:齐次矩阵矩阵。
  • scale:尺度放缩因子,[行方向因子,列方向因子]。
  • rotation:旋转的角度(顺时针,用弧度表示),实型。
  • translation各坐标轴的平移量,实型。

  • dimensionality:变换的维数,整型

与等距变换相同,也有两种变换方式,一种是直接用matrix定义的变换矩阵,另一种是单独设定均匀尺度因子、旋转角和平移量等信息。

4.3.3 仿射变换

在像素变换基础之上,如果不再要求缩放操作中水平和垂直的放缩因子必须相等的条件,相当于平移、旋转、放缩以及错切的任意组合,得到的变换即为仿射变换(Affine transformation)。仿射变换的特点是原始图像中的平行关系和线段长度比例关系保持不变。

M_A表示仿射变换矩阵,它由6个参数构成,

M_A=\begin{bmatrix}a_{11}& a_{12}& a_{13}\\ a_{21}& a_{22}& a_{23} \\ 0 & 0 & 1\end{bmatrix}

可见,需要用6个参数描述M_A,因此此时需要三组点,共6个方程才能确定全部参数。

在Skimage中,使用AffineTransform函数完成相似变换矩阵的设定。

函数生成欧式变换矩阵

看一下AffineTransform函数的声明:

AffineTransform(matrix, scale, rotation, shear, translation, dimensionality)

部分参数说明

  • matrix:仿射变换矩阵。如果该值不为空,则其相邻的三个量(角度1+平移2+错切)等三类操作
  • scale:尺度放缩因子,[行方向因子,列方向因子]。
  • rotation:旋转的角度(顺时针,用弧度表示),实型。
  • translation各坐标轴的平移量,实型。

  • dimensionality:变换的维数,整型

与等距变换相同,放射变换也有两种变换方式,一种是直接用matrix定义的变换矩阵,另一种是单独设定均匀尺度因子、旋转角、平移量和错切量等信息。

AffineTransform在Skimage中,使用AffineTransformd的链接,请读者自行查阅。

4.3.4 综合实例

(综合实例部分,修订稿时再补齐,估计要月底)

本节初稿完成时间:2024-02-08

(欢迎对DIP+python算法开发感兴趣的初学者,尤其是相关专业本科和低年级研究生关注,本专栏完将持续更新,总篇数不会少于50篇,每篇不会少于5000字,专栏完成之前(估计至少半年)完全免费阅读,敬请关注)

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值