)
目录前言4.1 本章学习目标4.2 基础概念4.3 图像缩放 cv2.resize ()4.4 图像镜像翻转 cv2.flip ()4.5 图像平移warpAffine4.6 图像旋转4.7 通用仿射变换4.8 本章小结前言承接第 3 章色彩空间。本章对图像做空间位置变换放大缩小、移位、旋转、翻转理解仿射变换矩阵全部搭配可运行代码专栏风格统一。4.1 本章学习目标理解图像几何变换本质矩阵运算像素坐标发生改变掌握缩放、翻转、平移、旋转 API 使用弄懂变换矩阵M的作用理解仿射变换概念学会warpAffine通用接口区分插值方式搞懂缩放时插值参数选择4.2 基础概念图像几何变换不修改像素颜色值只改变每个像素的坐标位置。OpenCV 绝大多数几何变换底层依靠变换矩阵 M配合cv2.warpAffine()完成。注意图像矩阵坐标规则左上角为原点x 向右增大y 向下增大。4.3 图像缩放 cv2.resize ()缩放改变图像宽高是最常用操作。cv2.resize(src, dsize, fx, fy, interpolation)src输入图像dsize输出尺寸(宽度,高度)注意顺序(width, height)和img.shape的(H,W,C)相反fxx 方向缩放系数fyy 方向缩放系数interpolation插值算法什么是插值放大图片需要补像素双线性插值画质最柔和、效果最优缩小图片用INTER_AREA防模糊失真常用插值INTER_NEAREST最近邻直接抄临近像素放大全是马赛克INTER_LINEAR双线性平滑插值补像素放大画质清晰自然默认首选INTER_AREA区域插值适合缩小图片抗锯齿示例代码import cv2 img cv2.imread(rD:\pythoncode2\bigdata_ai40\Image\qie.png) if img is None: print(读取失败) else: h,w img.shape[:2] # 方式1直接指定输出宽高主要 img_resize1 cv2.resize(img, (400,300)) # 方式2按比例缩放宽高变为原来0.5倍 img_resize2 cv2.resize(img, None, fx0.5, fy0.5, interpolationcv2.INTER_AREA) cv2.imshow(origin,img) cv2.imshow(resize2,img_resize2) cv2.waitKey(0) cv2.destroyAllWindows()高频坑resize(dsize(w,h))先宽后高shape返回(h,w)顺序相反很容易写反。4.4 图像镜像翻转 cv2.flip ()pythoncv2.flip(src, flipCode)flipCode 0上下翻转flipCode 0左右翻转flipCode 0同时上下 左右翻转import cv2 img cv2.imread(rD:\pythoncode2\bigdata_ai40\Image\qie.png) img_flip_lr cv2.flip(img,1) #左右翻转 img_flip_ud cv2.flip(img,0) #上下翻转 cv2.imshow(lr,img_flip_lr) cv2.imshow(ud,img_flip_ud) cv2.waitKey(0) cv2.destroyAllWindows()实战用途数据集增强扩充样本数量。4.5 图像平移warpAffine图像平移是指在不改变图像大小、角度、形态的前提下将整张图像沿 X、Y 坐标轴做位置偏移是最简单的仿射变换。平移操作的核心本质是像素坐标矩阵运算通过固定的平移变换矩阵批量修改图像所有像素的坐标位置。平移变换矩阵公式如下公式中为 X 轴偏移量正数图像向右偏移负数向左偏移为 Y 轴偏移量正数图像向下偏移负数向上偏移。import cv2 import numpy as np img cv2.imread(rD:\pythoncode2\bigdata_ai40\Image\qie.png) h,w img.shape[:2] # x向右移50y向下移30 M np.float32([[1,0,50], [0,1,30]]) img_shift cv2.warpAffine(img, M, (w, h)) cv2.imshow(shift,img_shift) cv2.waitKey(0) cv2.destroyAllWindows()移出画面的部分直接丢失空白区域填充黑色。4.6 图像旋转cv2.getRotationMatrix2D(center, angle, scale)center旋转中心点(x,y)angle旋转角度正数逆时针负数顺时针scale缩放系数得到旋转矩阵 M 之后依然交给warpAffine执行变换。import cv2 import numpy as np img cv2.imread(rD:\pythoncode2\bigdata_ai40\Image\qie.png) h,w img.shape[:2] # 旋转中心图片中心点 center (w//2, h//2) # 逆时针旋转45度缩放1倍 M cv2.getRotationMatrix2D(center, 45, 1) img_rot cv2.warpAffine(img, M, (w, h)) cv2.imshow(rot,img_rot) cv2.waitKey(0) cv2.destroyAllWindows()注意直接旋转后边角会被裁切想要完整显示旋转后的图像需要手动计算新画布尺寸。4.7 通用仿射变换平移、旋转、缩放、剪切均属于仿射变换底层均为矩阵运算核心特性图像直线不变形、平行关系始终保持。cv2.getAffineTransform() 核心作用无需手动推导变换矩阵只需输入原图3个不共线关键点和变换后对应的3个目标点即可自动求解出唯一仿射变换矩阵 M搭配warpAffine即可完成全图变换。核心原理仿射变换矩阵为 2×3 结构共6个未知参数每组对应点可提供2组坐标方程3组点刚好凑齐6个方程求解出唯一矩阵。注意三点不可共线否则求解失效。常用实战场景图像矫正矫正倾斜文档、工件通过三点映射拉直图像自定义形变快速实现图像倾斜、拉伸、剪切无需手动计算角度、偏移参数数据增强对图像做随机仿射畸变扩充深度学习训练样本。python import cv2 import numpy as np img cv2.imread(rD:\pythoncode2\bigdata_ai40\Image\qie.png) h,w img.shape[:2] # 原图三个点 src np.float32([[50,50],[200,50],[50,200]]) # 变换后对应三个点 dst np.float32([[10,100],[200,50],[100,250]]) M cv2.getAffineTransform(src, dst) img_aff cv2.warpAffine(img, M, (w, h)) cv2.imshow(affine, img_aff) cv2.waitKey(0) cv2.destroyAllWindows()4.8 本章小结resize缩放、flip翻转是高频简单接口。平移、旋转、仿射变换都生成变换矩阵统一交给warpAffine执行。仿射变换保证直线、平行关系不变只要 3 组对应点就可以求解变换矩阵。时刻分清(h,w)来自 shape接口 dsize 参数是(w,h)。