opencv-python教程学习系列11-几何变换
前言
opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍几何变换,坚持学习,共同进步。
系列教程参照OpenCV-Python中文教程;
系统环境
系统:win7_x64;
python版本:python3.5.2;
opencv版本:opencv3.3.1;
内容安排
1.知识点介绍;
2.测试代码;
具体内容
1.知识点介绍;
主要涉及函数cv2.getPerspectiveTransform,cv2.warpAffine和cv2.warpPersperctive;
1.1 缩放;
缩放仅仅改变图像尺寸,opencv提供的函数cv2.resize()可以实现此功能。图片的尺寸可以指定尺寸大小,或者指定缩放因子。可以使用不同的插值运算方法,在缩放时推荐的插值运算方法是 cv2.INTER_AREA,在扩展时推荐使用v2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默认情况下改变图像大小的操作使用插值方法是cv2.INTER_LINEAR,可以使用任意一种方法改变图像尺寸。
1 2 3 4 5 6 7 | ##None为图像尺寸时,fx和fy参数是缩放因子 res = cv2.resize(img, None ,fx = 2 ,fy = 2 ,interpolation = cv2.INTER_CUBIC) #or #这里直接设置输出图像的尺寸,所以不用设置缩放因子 height, width = img.shape[: 2 ] res = cv2.resize(img,( 2 * width, 2 * height),interpolation = cv2.INTER_CUBIC) #注意,integer argument expected;那怎么缩小呢?? |
1.2 平移;
平移就是移动对象位置。如果你知道移动方向(x,y),移动距离是(tx,ty),可以创建如下矩阵。
可以使用Numpy数组构建矩阵,数据类型是np.float32,然后将其传入函数cv2.warpAffine();
函数cv2.warpAffine() 第三个参数是输出图像的大小,格式是图像的(宽,高)。
注意,图像的宽对应的是列数,高对应的是行数。
1 2 | M = np.float32([[ 1 , 0 , 100 ], [ 0 , 1 , 50 ]]) dst = cv2.warpAffine(img, M, (cols,rows)) |
1.3 旋转;
对一个图像旋转角度θ,旋转矩阵如下:
在opencv中允许在任意地方进行旋转,旋转矩阵如下:
其中,
opencv提供了cv2.getRotationMatrix2D函数来实现旋转矩阵;
1 2 3 | M = cv2.getRotationMatrix2D((cols / 2 ,rows / 2 ), 45 , 0.6 ) #第三个参数是输出图像的尺寸中心 dst = cv2.warpAffine(img, M, ( 2 * cols, 2 * rows)) |
1.4 仿射变换;
仿射变换中,原图中的平行线变换后依然平行。创建仿射变换矩阵需要在图像中找三个点和这三个点在输出图像的位置。使用cv2.getAffineTransform函数创建2*3的仿射变换矩阵,矩阵会被传递给cv2.warpAffine函数;
1 2 3 4 5 | pts1 = np.float32([[ 50 , 50 ],[ 200 , 50 ],[ 50 , 200 ]]) pts2 = np.float32([[ 10 , 100 ],[ 200 , 50 ],[ 100 , 250 ]]) #行,列,通道数 M = cv2.getAffineTransform(pts1, pts2) dst = cv2.warpAffine(img, M, (cols,rows)) |
1.5 透视变换;
透视变换需要3*3的矩阵,透视变换后直线还是直线,建立透视矩阵需要在图像上找4个点,以及他们在输出图像上的对应位置,这四个点任意三个不能共线。由cv2.getPerspectiveTransform() 构建矩阵,然后将矩阵传递给cv2.warpPerspective函数;
1 2 3 4 | pts1 = np.float32([[ 56 , 65 ],[ 368 , 52 ],[ 28 , 387 ],[ 389 , 390 ]]) pts2 = np.float32([[ 0 , 0 ],[ 300 , 0 ],[ 0 , 300 ],[ 300 , 300 ]]) M = cv2.getPerspectiveTransform(pts1, pts2) dst = cv2.warpPerspective(img, M, ( 300 , 300 )) |
2.测试代码;
2.1 缩放/旋转等;
1 2 3 4 5 6 7 8 9 10 11 12 13 | import cv2 img = cv2.imread( 'test.jpg' , 0 ) rows,cols = img.shape #这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子 #可以通过设置旋转中心,缩放因子以及窗口大小来防止旋转后超出边界的问题。 M = cv2.getRotationMatrix2D((cols / 2 ,rows / 2 ), 45 , 0.6 ) #第三个参数是输出图像的尺寸中心 dst = cv2.warpAffine(img,M,( 2 * cols, 2 * rows)) while ( 1 ): cv2.imshow( 'img' ,dst) if cv2.waitKey( 1 ) = = 27 : break cv2.destroyAllWindows() |
2.2 仿射/透视变换;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread( 'test.jpg' ) rows,cols,ch = img.shape pts1 = np.float32([[ 56 , 65 ],[ 368 , 52 ],[ 28 , 387 ],[ 389 , 390 ]]) pts2 = np.float32([[ 0 , 0 ],[ 300 , 0 ],[ 0 , 300 ],[ 300 , 300 ]]) M = cv2.getPerspectiveTransform(pts1, pts2) dst = cv2.warpPerspective(img, M, ( 300 , 300 )) plt.subplot( 121 ), plt.imshow(img), plt.title( 'Input' ) plt.subplot( 122 ), plt.imshow(dst), plt.title( 'output' ) plt.show() |
参考
1.几何变换;
2.CSDN几何变换;
完
心正意诚,做自己该做的事情,做自己喜欢做的事情,安静做一枚有思想的技术媛。
版权声明,转载请注明出处:https://www.cnblogs.com/happyamyhope/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】