【学习OpenCV4】仿射变换与透视变换总结

本文分享内容来自图书《学习OpenCV 4:基于Python的算法实战》,该书内容如下:

1章 OpenCV快速入门;
第2章 图像读写模块imgcodecs;
第3章 核心库模块core;
第4章 图像处理模块imgproc(一);
第5章 图像处理模块imgproc(二);
第6章 可视化模块highgui;
第7章 视频处理模块videoio;
第8章 视频分析模块video;
第9章 照片处理模块photo;
第102D特征模块features2d;
第11章 相机标定与三维重建模块calib3d;
第12章 传统目标检测模块objdetect;
第13章 机器学习模块ml;
第14章 深度神经网络模块dnn

欢迎关注图书《深度学习计算机视觉实战》与《学习OpenCV4:基于Python的算法实战》。

在这里插入图片描述

案例50:仿射变换

仿射变换是实现图像旋转,平移和缩放的常见操作,仿射变换后的图像具有平行性与平直性,即能够很好的保持原有图像中的直线关系与平行关系。OpenCV中提供了仿射变换操作的函数warpAffine,函数定义如下:

dst = warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)

参数说明如下:
src,输入图像;
M,2x3的变换矩阵;
dsize,输出图像尺寸;
dst,输出图像(返回值);
flags,插值方式,由InterpolationFlags定义(见4.3节);
borderMode,边界模式,由BorderTypes定义(见3.4.5节);
borderValue,当边界模式为BORDER_CONSTANT时的边界值。
仿射变换需要通过函数getRotationMatrix2D生成变换矩阵,该函数的定义如下:

retval = getRotationMatrix2D(center, angle, scale)

参数说明如下:
center,输入图像的旋转的中心;
angle,旋转角度,正数值为逆时针旋转;
scale,缩放系数;
retval,生成的旋转矩阵(返回值)。
如果设置旋转角度angle为0,缩放系数为0.6,则可以实现图像的缩放,案例代码如下:

import cv2

img = cv2.imread('src.jpg')
rows, cols, channels = img.shape
#获取仿射变换矩阵
M = cv2.getRotationMatrix2D((cols/2, rows/2), 0, 0.6)
#仿射变换
affine_img = cv2.warpAffine(img, M, (cols, rows))
#图像显示
cv2.imshow("affine_img", affine_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

缩放的结果如图5.8所示。
在这里插入图片描述

图5.8
如果设置旋转角度angle为45,即进行逆时针45度旋转,缩放系数为0.6,则可以实现图像的旋转和缩放,变换矩阵生成的代码如下:

M = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 0.6)

旋转缩放的结果如图5.9所示。
在这里插入图片描述

图5.9

5.3 案例51:透视变换

透视变换是在二维平面获得接近真实三维物体的视觉效果一种算法,OpenCV提供了透视变换的函数warpPerspective,该函数定义如下:

dst = warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)

函数对应的参数含义说明:
src,输入图像;
M,3×3的变换矩阵;
dsize,输出图像尺寸;
dst,输出图像(返回值);
flags,插值方式,由InterpolationFlags定义;
borderMode,边界模式,由BorderTypes定义(见3.4.5节);
borderValue,当边界模式为BORDER_CONSTANT时的边界值。
插值方式InterpolationFlags的定义如下:

enum InterpolationFlags{
    INTER_NEAREST        	= 0,		#最近邻插值
    INTER_LINEAR         	= 1,		#双线性插值	
    INTER_CUBIC          	= 2,		#双三次插值
    INTER_AREA           	= 3,		#不支持
    INTER_LANCZOS4       	= 4,		#Lanczos插值
    INTER_LINEAR_EXACT 		= 5,		#按位双线性插值
    INTER_MAX            	= 7,		#差值代码mask
    WARP_FILL_OUTLIERS   	= 8,		#是否填充所有目标图像像素的标志
    WARP_INVERSE_MAP     	= 16		#是否翻转变换的标志
};

3×3的变换矩阵可以通过函数getPerspectiveTransform获取,函数定义如下:

retval = getPerspectiveTransform(src, dst, solveMethod=None)

函数参数说明如下:
src,输入图像中四边形顶点的坐标;
dst,输出图像中相应四边形顶点的坐标;
solveMethod,矩阵分解类型;
retval,生成的透视变换矩阵(返回值);
使用warpPerspective函数进行透视变换的案例代码如下:

import cv2
import numpy as np

img = cv2.imread('src.jpg')
height, width, channel = img.shape
#设置源图像中四边形顶点的坐标
pSrc = np.float32([[0, 0], [width-1, 0], [width-1, height-1], [0, height-1]])
#设置目标图像中相应四边形顶点的坐标
pDst = np.float32([[width*0.02, height*0.1], [width*0.8, width*0.2], [width*0.9, height*0.8], [width*0.2, height*0.8]])
#生成3x3透视变换矩阵
M = cv2.getPerspectiveTransform(pSrc, pDst)
#透视变换
dst = cv2.warpPerspective(img, M, (height, width))
cv2.imshow("perspective_result", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

透视变换的结果如图5.10所示。
在这里插入图片描述

图5.10

版权声明:本文为CSDN博主「计算机视觉与OpenCV」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lxiao428/article/details/123103222

视觉魔法师

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

python-OpenCV图像图形检测(四)

实例下载:图形检测,检测图形轮廓,边缘检测,轮廓拟合 一、简介 图形检测是计算机视觉的一项重要功能,通过图形检测可以分析图像中可能存在的形状,然后对这些形状进

OpenCV——对象提取

对象提取,简而言之就是获取指定图像,去除其他图像. 解决思路 二值处理 形态学处理(开运算闭运算,轮廓发现) 横纵比过滤计算 . 代码实现 #include<openc