OpenCV4机器学习:图像的几何变换仿射变换

Posted AI 菌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV4机器学习:图像的几何变换仿射变换相关的知识,希望对你有一定的参考价值。

前言:

本专栏主要结合OpenCV4(C++版本),来实现一些基本的图像处理操作、经典的机器学习算法(比如K-Means、KNN、SVM、决策树、贝叶斯分类器等),以及常用的深度学习算法。

系列文章:


一、基本原理

图像的平移、缩放、镜像和旋转等都属于几何变换。在数字图像处理中,几何变换由两个基本操作构成:坐标变换和灰度内插。坐标变换公式可表示为: ( x , y ) = T [ ( v , w ) ] (x, y) = T[(v, w)] (x,y)=T[(v,w)]

其中,(v, w)是源图像中的像素坐标;(x, y)是变换后图像中的像素坐标。

最常见的空间变换之一是仿射变换,其一般形式如下:

根据矩阵T中元素的取值不同,仿射变换又可分为:恒等变换、尺度变换、旋转变换、平移变换、垂直变换或者水平剪切变换。具体如下表所示:

变换名称仿射矩阵T坐标公式
恒等变换 [ 1 0 0 0 1 0 0 0 1 ] \\left[ \\begin{matrix}1 & 0 & 0 \\\\ 0 & 1 & 0 \\\\ 0 & 0 & 1 \\end{matrix} \\right] 100010001 x = v , y = w x=v, y=w x=v,y=w
尺度变换 [ c x 0 0 0 c y 0 0 0 1 ] \\left[ \\begin{matrix}c_{x} & 0 & 0 \\\\ 0 & c_{y} & 0 \\\\ 0 & 0 & 1 \\end{matrix} \\right] cx000cy0001 x = c x v , y = c y w x =c_{x}v, y=c_{y}w x=cxv,y=cyw
旋转变换 [ c o s θ s i n θ 0 − s i n θ c o s θ 0 0 0 1 ] \\left[ \\begin{matrix}cos\\theta & sin\\theta & 0 \\\\ -sin\\theta &cos\\theta & 0 \\\\ 0 & 0 & 1 \\end{matrix} \\right] cosθsinθ0sinθcosθ0001 x = v c o s θ − w s i n θ , y = v s i n θ + w c o s θ x=vcos\\theta-wsin\\theta, y=vsin\\theta+wcos\\theta x=vcosθwsinθ,y=vsinθ+wcosθ
平移变换 [ 1 0 0 0 1 0 t x t y 1 ] \\left[ \\begin{matrix}1 & 0 & 0 \\\\ 0 & 1 & 0 \\\\ t_{x} & t_{y} & 1 \\end{matrix} \\right] 10tx01ty001 x = v + t x , y = w + t y x=v+t_{x}, y=w+t_{y} x=v+tx,y=w+ty
垂直变换 [ 1 0 0 s h 1 0 0 0 1 ] \\left[ \\begin{matrix}1 & 0 & 0 \\\\ s_{h} & 1 & 0 \\\\ 0 & 0 & 1 \\end{matrix} \\right] 1sh0010001 x = v + w s h , y = w x=v+ws_{h}, y=w x=v+wsh,y=w
水平剪切变换 [ 1 s v 0 0 1 0 0 0 1 ] \\left[ \\begin{matrix}1 & s_{v} & 0 \\\\ 0 & 1 & 0 \\\\ 0 & 0 & 1 \\end{matrix} \\right] 100sv10001 x = v , y = w + v s v x=v, y=w+vs_v x=v,y=w+vsv

二、仿射变换 warpAfine

在 OpenCV 中,实现仿射变换的函数为:cv::warpAffine 函数。其定义如下:

void cv::warpAffine(InputArray src,
					OutputArray dst,
					InputArray M,
					Size dsize,
					int flags = INTER_LINEAR,
					int borderMode = BORDER_CONSTANT,
					const Scalar= & boaderValue = Scalar())

各参数介绍:

  • src:输入图像
  • dst:输出图像
  • M:变换矩阵
  • dsize:输出图像尺寸;如果dsize=(0,0),则由下式计算:dsize=Size(round(fx * src.cols), round(fy * src.rows))
  • flags:组合标志位
  • borderMode:像素外推方法
  • borderValue:在边界位恒定值的情况下使用的数值,默认为0

通过改变 warpAffine 函数中的变换矩阵 M ,可以轻松实现:恒等变换、尺度变换、旋转变换、平移变换、垂直变换或者水平剪切变换

三、尺度变换

(1)resize 函数实现

尺度变换又称图像缩放,在OpenCV中,可使用resize函数来实现尺度变换。resize函数定义如下:

void cv::resize(InputArray src,
				OutputArray dst,
				Size dsize,
				Double fx=0,
				Double fy=0,
				Int interpolation = INTER_LINEAR)

各参数介绍:

  • src:输入图像
  • dst:输出图像
  • dsize:输出图像尺寸;如果dsize=(0,0),则由下式计算:dsize=Size(round(fx * src.cols), round(fy * src.rows))
  • fx:水平轴缩放比例因子;fx、fy不能全部为0。
  • fy:垂直轴缩放比例因子
  • interpolation:插值算法

通过调用 resize 函数,可将原图缩放为原来的一半大小:

resize(img, img_resize, cv::Size(0, 0), 0.5, 0.5, 1);

(2)warpAffine 函数实现

所谓尺度变换,就是要将图像中像素的原坐标(v, w)按照 x = c x v , y = c y w x =c_{x}v, y=c_{y}w x=c图像几何基于图像空间变换(仿射变换)matlab源码含 GUI

OpenCV学习笔记——图像几何变换

Python图像处理丨带你掌握图像几何变换

[Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)

对图像的仿射变换

OpenCV实现图像的几何变换