【python-opencv】图像几何变换

摘要:
如果你知道(x,y)方向的偏移,让它为,你可以创建变换矩阵M,如下所示:可以将其设置为np.float32类型的Numpy数组,并将其传递给cv.warpAffine()函数.importcv2importnumpyasnpimg=cv2.imreadrows,cols=img.shapeM=np.float32dst=cv2.warpAffinecv2.imshowcv2.imshowcv2.waitKeycv2.destroyAllWindows()结果:4、图像旋转通过变换矩阵实现图像旋转角度θ:OpenCV提供可调旋转,旋转中心可调,因此可以在任何的位置旋转.修正的变换矩阵由下式给出:为了找到这个转换矩阵,OpenCV提供了一个函数cv2.getRotationMatrix2D.img=cv.imreadrows,cols=img.shape#cols-1和rows-1是坐标限制M=cv.getRotationMatrix2Ddst=cv.warpAffine结果:5、仿射变换在仿射变换中,原始图像中的所有平行线在输出图像中仍将平行。

1、变换

OpenCV提供了两个转换函数cv.warpAffinecv.warpPerspective,您可以使用它们进行各种转换。cv.warpAffine采用2x3转换矩阵,而cv.warpPerspective采用3x3转换矩阵作为输入。

importcv2 as cv
from google.colab.patches importcv2_imshow
image=cv.imread('变换.jpg')
#得到图片的高和宽
height,width=image.shape[:2]
#定义对应的点
points1 = np.float32([[75,55], [340,55], [33,435], [400,433]])
points2 = np.float32([[0,0], [360,0], [0,420], [360,420]])
#计算得到转换矩阵
M =cv.getPerspectiveTransform(points1, points2)
#实现透视变换转换
processed = cv.warpPerspective(image,M,(360, 420))
cv2_imshow(processed)

结果:

【python-opencv】图像几何变换第1张【python-opencv】图像几何变换第2张

参考:https://zhuanlan.zhihu.com/p/37023649

2、缩放

缩放只是调整图像的大小。为此,OpenCV带有一个函数cv.resize()。图像的大小可以手动指定,也可以指定缩放比例。也可使用不同的插值方法。首选的插值方法是cv.INTER_AREA用于缩小,cv.INTER_CUBIC(慢)和cv.INTER_LINEAR用于缩放。默认情况下,出于所有调整大小的目的,使用的插值方法为cv.INTER_LINEAR。您可以使用以下方法调整输入图像的大小

importnumpy as np
importcv2 as cv
img = cv.imread('messi5.jpg')
res = cv.resize(img,None,fx=2, fy=2, interpolation =cv.INTER_CUBIC)
#或者
height, width = img.shape[:2]
res = cv.resize(img,(2*width, 2*height), interpolation = cv.INTER_CUBIC)

结果:

【python-opencv】图像几何变换第3张【python-opencv】图像几何变换第4张

3、平移

平移是对象位置的转换。 如果你知道(x,y)方向的偏移,让它为(tx,ty),你可以创建变换矩阵M,如下所示:

【python-opencv】图像几何变换第5张

可以将其设置为np.float32类型的Numpy数组,并将其传递给cv.warpAffine()函数.

importcv2
importnumpy as np

img = cv2.imread('img.jpg',0)
rows,cols =img.shape

M = np.float32([[1,0,100],[0,1,50]])
dst =cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

【python-opencv】图像几何变换第6张【python-opencv】图像几何变换第7张

4、图像旋转

通过变换矩阵实现图像旋转角度θ:

【python-opencv】图像几何变换第8张

OpenCV提供可调旋转,旋转中心可调,因此可以在任何的位置旋转.修正的变换矩阵由下式给出:

【python-opencv】图像几何变换第9张

【python-opencv】图像几何变换第10张

为了找到这个转换矩阵,OpenCV提供了一个函数cv2.getRotationMatrix2D.

img = cv.imread('messi5.jpg',0)
rows,cols =img.shape
#cols-1 和 rows-1 是坐标限制
M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1)
dst = cv.warpAffine(img,M,(cols,rows))

结果:

【python-opencv】图像几何变换第11张

5、仿射变换

在仿射变换中,原始图像中的所有平行线在输出图像中仍将平行。为了找到变换矩阵,我们需要输入图像中的三个点及其在输出图像中的对应位置。然后cv.getAffineTransform将创建一个2x3矩阵,该矩阵将传递给cv.warpAffine

查看以下示例,并查看我选择的点(以绿色标记):

img = cv.imread('drawing.png')
rows,cols,ch =img.shape
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M =cv.getAffineTransform(pts1,pts2)
dst =cv.warpAffine(img,M,(cols,rows))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')

结果:

【python-opencv】图像几何变换第12张

6、透视变换

对于透视变换,您需要3x3变换矩阵。即使在转换后,直线也将保持直线。要找到此变换矩阵,您需要在输入图像上有4个点,在输出图像上需要相应的点。在这四个点中,其中三个不应共线。然后可以通过函数cv.getPerspectiveTransform找到变换矩阵。然后将cv.warpPerspective应用于此3x3转换矩阵。

请参见下面的代码:

img = cv.imread('sudoku.png')
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 =cv.getPerspectiveTransform(pts1,pts2)
dst = cv.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()

结果:

【python-opencv】图像几何变换第13张

参考:

http://woshicver.com/FifthSection/4_2_%E5%9B%BE%E5%83%8F%E5%87%A0%E4%BD%95%E5%8F%98%E6%8D%A2/

免责声明:文章转载自《【python-opencv】图像几何变换》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇图表展现技巧(多图)Go go.mod入门下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

opencv配置过程 (cmake,vs2013,qt 5.4)

平台及软件: Windows 7 X86 Visual Studio 2013 OpenCV3.0.0 Cmake3.3 1、下载Windows下的安装文件OpenCV-3.0.0.exe,解压,选择需要的安装目录即可。(本文为F:\opencv) 注意相应的目录不能包含中文。 2、Cmake编译 执行CMake,用于把OpenCV的源码生成对应的VS工程...

OpenCV白平衡算法之灰度世界法(消除RGB受光照影响)

在用OpenCV对图像进行处理时,利用颜色定位是常常会接触到的方法,但RGB受光照影响比较严重,转换到HSV XYZ等空间也解决不了时, 可以用白平衡算法进行修正,使其发黄、发蓝、发红的照片更加趋于自然光下的图像。(转摘请说明来源) 程序代码示例如下: 1 //该代码实现白平衡算法中的灰度世界法,能有效改善图像发红发蓝发绿的现象; 2 3 #includ...

windows环境下的Anaconda安装与OpenCV机器视觉环境搭建

https://blog.csdn.net/iracer/article/details/80498732 本文介绍win7和win10系统下通过Anaconda配置基于python语言的机器视觉编程环境(博主测试了两个系统下的安装基本相同),主要内容包括: Anaconda下载安装OpenCV下载安装测试安装结果本文安装的版本为:Anaconda4.2+...

OpenCV中出现“Microsoft C++ 异常: cv::Exception,位于内存位置 0x0000005C8ECFFA80 处。”的异常

对于OpenCV的安装 要感谢网友空晴拜小白提供的教程 链接如下: https://blog.csdn.net/sinat_36264666/article/details/73135823?ref=myread#reply 教程写的十分详细 截图什么的也很好 2 问题描述今天在安装和测试OpenCV的时候遇到了这样的问题 测试代码如下 #include...

使用 opencv 将图片压缩到指定文件尺寸

前言 图片压缩应用很广泛,如生成缩略图等。前期我在进行图片处理的过程中碰到了一个问题,就是如何将图片压缩到指定尺寸,此处尺寸指的是生成图片文件的大小。 我使用 opencv 进行图片处理,于是想着直接使用 opencv 进行图片压缩处理, opencv 本身包含了压缩到指定像素大小的方法,奈何寻找了很多方法均不能压缩到指定文件尺寸,于是自己在思考后写出了此...

Opencv | 图形学 | Mingw64 | 如何正确地用MinGW64编译与配置vscode的Opencv环境

如何正确地用MinGW64编译与配置vscode的Opencv环境 1.前情提要 最近有关于图形学的授课,教授开始布置的上机打码的代码实现作业了。虽说教授为了让我们省心,直接就整了个环境已经配置好的几个G的虚拟机给我们用。但是你也懂的,虚拟机打码,卡得要命。一开始还以为会用到什么高级的库,看了下就是个Eigen3和Opencv,对于Opencv,感觉自己手...