OpenCV4机器学习:图像的几何变换仿射变换
Posted AI 菌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV4机器学习:图像的几何变换仿射变换相关的知识,希望对你有一定的参考价值。
前言:
本专栏主要结合OpenCV4(C++版本),来实现一些基本的图像处理操作、经典的机器学习算法(比如K-Means、KNN、SVM、决策树、贝叶斯分类器等),以及常用的深度学习算法。
系列文章:
- OpenCV4机器学习(一):OpenCV4+VS2017环境搭建与配置
- OpenCV4机器学习(二):图像的读取、显示与存储
- OpenCV4机器学习(三):颜色空间(RGB、HSI、HSV、Lab、Gray)之间的转换
一、基本原理
图像的平移、缩放、镜像和旋转等都属于几何变换。在数字图像处理中,几何变换由两个基本操作构成:坐标变换和灰度内插。坐标变换公式可表示为: ( 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