公司动态

图像预处理2-几何变换

📅 2026/7/29 10:53:51
图像预处理2-几何变换
几何变换包括了图像的平移、缩放、旋转、中心裁剪、透视变换opencv 传统计算机视觉图像处理库进行图像的几何变换也有TensorFlow库专门给张量(Tensor)进行的图像几何变换PyTorch可以进行PIL图像以及Tensor张量的处理注意TensorFlow和PyTorch都是在线增强此次应用到的都是opencv库1、 图像平移将图像中所有的点按照指定的平移量水平或者垂直移动 属于仿射变换dst cv2.warpAffine(src, M, dsize, flags, borderMode, borderValue)1、 src 输入原图可以是灰度图也可以是彩色图反正opencv读取的是numpy数组2、M指的是一个2X3 的浮点变换矩阵 必须置顶dtypenp.float32否则报错示例向右平移50个像素向下平移30个像素 【不懂可见平移变换的原理】import numpy as np M np.array([ [1, 0, 50], [0, 1, 30] ], dtypenp.float32)3、dsize输出图像尺寸 宽高 一般写成dsizewh4、flags插值方式默认不用改图像像素填充算法平移几乎都用默认cv2.INTER_LINEAR双线性插值默认二值掩码图可用cv2.INTER_NEAREST5、borderMode 边界填充模式默认cv2.BORDER_CONSTANT纯色填充空白区域 一般不修改。6、borderValue平移后空白区域填充颜色灰度图borderValue0黑色默认BGR 彩色图borderValue(255,255,255)白色平移变换的原理原来的像素的位置坐标为x0,y0经过平移量△x△y后坐标变为x1,y1如下所示1、用数学式子表示可以表示为x1 x0 △x,y1 y0 △y2、用矩阵表示为代码演示import cv2 import numpy as np img cv2.imread(test.jpg) h, w img.shape[:2] tx -40 # 左移40 ty -20 # 上移20 M np.float32([[1, 0, tx], [0, 1, ty]]) # 空白区域填充白色 shift_img cv2.warpAffine( img, M, dsize(w, h), borderValue(255, 255, 255) ) cv2.imshow(img, img) cv2.imshow(shift, shift_img) cv2.waitKey(0) cv2.destroyAllWindows()结果呈现2、图像缩放缩小图像称为下采样subsampled或降采样(downsampled)放大图像称为上采样upsampled主要目的是得到更高分辨率的图像cv2.resize(src, dsize, dstNone, fxNone, fyNone, interpolationNone)参数说明1、src输入图片2、dsize目标输出的尺寸 如第一个图像平移所示3、dst输出图像基本不用直接res_imgcv2.resize(...)4、fx:【X 轴水平方向缩放比例】fx 1宽度不变fx 1宽度放大上采样fx 1宽度缩小下采样fx0代表以 dsize 尺寸为准比例失效示例宽度变为原图 0.6 倍 →fx0.65、fy: 【Y 轴垂直方向缩放比例】和 fx 逻辑完全一致控制高度 fy0.8 → 高度缩为原图 80%fx、fy 使用硬性前提: 必须让 dsize None否则 fx/fy 不会生效。6、interpolation :【插值算法缩放画质算法】插值常量适用场景特点cv2.INTER_LINEAR默认放大图片双线性插值平滑自然默认首选cv2.INTER_AREA缩小图片预处理必用区域重采样抗锯齿、防模糊、无波纹cv2.INTER_NEAREST二值掩码、分割图最近邻插值速度最快会有马赛克cv2.INTER_CUBIC大幅度高清放大三次卷积画质最好速度最慢下采样缩小统一尺寸interpolationcv2.INTER_AREA上采样放大默认interpolationcv2.INTER_LINEA缩放的原理水平缩放系数为sx垂直缩放系数为sy(x0,y0)为缩放前坐标(x,y)为缩放后坐标其缩放的坐标映射关系矩阵表示的形式为演示代码import cv2 import numpy as np img cv2.imread(test.jpg) if img is None: raise FileNotFoundError(图片不存在) # 放大1.8倍放大用默认双线性插值 resize_big cv2.resize( img, dsizeNone, fx1.8, fy1.8, interpolationcv2.INTER_LINEAR ) cv2.imshow(img, img) cv2.imshow(enlarge, resize_big) cv2.waitKey(0) cv2.destroyAllWindows()结果呈现3、 裁剪中心裁剪 tensorflow内置API 适合训练Pipelinecropped tf.image.central_crop(image, central_fraction0.5)OpenCV-Python无原生接口通过图像数组切片手动计算坐标实现等价中心裁剪适合本地离线批量预处理。4、 图像旋转以图像的中心为原点旋转一定的角度也就是将图像上的所有像素都旋转一个相同的角度。retval cv2.getRotationMatrix2D(center, angle, scale) #第一步获取旋转矩阵 rotate_img cv2.warpAffine(img, M, (w, h)) #第二步执行仿射变换完成旋转参数拆解1、center旋转中心点一般填图片中心(w/2, h/2)2、angle旋转角度正数逆时针旋转负数顺时针旋转3、scale旋转同时附带缩放系数1 不缩放注意旋转后的图像大小一般会发生改变因为转出显示区域的图像会被截去或者扩大图像范围来显示图像的所有部分示例代码import cv2 img cv2.imread(test.jpg) h, w img.shape[:2] # 1. 获取旋转矩阵中心、逆时针30度、不缩放 M cv2.getRotationMatrix2D((w/2, h/2), 30, 1) # 2. 执行旋转 rotate_img cv2.warpAffine(img, M, (w, h)) cv2.imshow(img, img) cv2.imshow(rotate, rotate_img) cv2.waitKey(0)结果呈现5、 透视变换透视变换本质是将图像投影到一个新的视平面M cv2.getPerspectiveTransform(src, dst) #1 计算透视变换矩阵 result cv2.warpPerspective(src, M, dsize) #2 应用透视矩阵完成变换1.cv2.getPerspectiveTransform(src, dst)src原图上4 个不规则四边形顶点必须 float32 数组顺序严格左上→右上→右下→左下dst想要变成的标准矩形 4 个顶点一般就是[[0,0],[w,0],[w,h],[0,h]]返回值3×3 透视变换矩阵 M2.cv2.warpPerspective(src, M, dsize)src原始图像M上面求出的透视矩阵dsize输出图片尺寸(宽度,高度)可选参数borderValue(255,255,255)空白区域填充白色示例代码import cv2 import numpy as np def perspective_correct(img, src_points, target_w, target_h): 透视变换矫正图片 :param img: cv2读取原图 :param src_points: 原图四个角点顺序左上、右上、右下、左下 :param target_w: 矫正后图片宽度 :param target_h: 矫正后图片高度 :return: 矫正完成图像 # 目标规整矩形四个点标准矩形 dst_points np.array([ [0, 0], [target_w, 0], [target_w, target_h], [0, target_h] ], dtypenp.float32) # 1. 计算透视变换矩阵 M cv2.getPerspectiveTransform(src_points, dst_points) # 2. 执行透视变换 result cv2.warpPerspective(img, M, (target_w, target_h)) return result if __name__ __main__: img cv2.imread(test.jpg) h, w img.shape[:2] src np.array([ [120, 80], # 左上角 [680, 60], # 右上角 [710, 520], # 右下角 [90, 490] # 左下角 ], dtypenp.float32) # 设置矫正后输出图片大小 out_width 600 out_height 400 # 透视矫正 warp_img perspective_correct(img, src, out_width, out_height) # 显示原图与矫正结果 cv2.imshow(img, img) cv2.imshow(perspective corrected, warp_img) cv2.waitKey(0) cv2.destroyAllWindows() # 保存矫正后的图片 cv2.imwrite(corrected_result.jpg, warp_img)结果呈现