图像预处理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)结果呈现

相关新闻

智能音频硬件技术突破:动态声学指纹与混合精度推理

智能音频硬件技术突破:动态声学指纹与混合精度推理

1. 智能音频硬件的技术拐点 2026年可能成为消费级智能硬件的分水岭——OpenAI最新路线图显示,其下一代音频模型将突破现有语音交互的三大瓶颈:在嘈杂环境下的98%识别准确率(当前行业平均为85%)、200ms级端到端响应延迟&#xff08…

2026/10/21 1:31:23 阅读更多 →
从肌电控制到3D打印:创客自制功能性假手的技术实现与避坑指南

从肌电控制到3D打印:创客自制功能性假手的技术实现与避坑指南

1. 项目概述:当创客精神与生命需求相遇“身残志坚”这个词,我们听过很多次,但当一个真实的创客,面对自己因故截肢的现实,选择不再等待,而是亲手用3D打印和开源硬件为自己打造一只功能性的电动假手时&#x…

2026/10/29 23:59:35 阅读更多 →
【爱马仕】Hermes 智能应用本地部署思路,整合包缩短调试与安装耗时(含安装包)

【爱马仕】Hermes 智能应用本地部署思路,整合包缩短调试与安装耗时(含安装包)

Hermes Windows 整合包落地教程,轻松搭建本地桌面智能 Agent 内容要点 整合全部运行依赖组件、省去手动环境调试、全程图形化引导、支持本地自动化任务处理 安装包下载地址:https://hm.ikidi.top/api/download/package/55?promoCodeIV644F14DA00 前…

2026/10/25 21:43:33 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/2 0:25:10 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/2 10:46:11 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/2 10:47:40 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/2 1:16:51 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/2 10:46:31 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/2 10:46:26 阅读更多 →

日新闻

周新闻

月新闻