文章目录[隐藏]
本文分享内容来自图书《学习OpenCV 4:基于Python的算法实战》,该书内容如下:
第1章 OpenCV快速入门;
第2章 图像读写模块imgcodecs;
第3章 核心库模块core;
第4章 图像处理模块imgproc(一);
第5章 图像处理模块imgproc(二);
第6章 可视化模块highgui;
第7章 视频处理模块videoio;
第8章 视频分析模块video;
第9章 照片处理模块photo;
第10章 2D特征模块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
暂无评论