python-opencv几何变换--仿射变换透视变换
Posted pheasant
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-opencv几何变换--仿射变换透视变换相关的知识,希望对你有一定的参考价值。
仿射变换
opencv提供了函数cv2.getAffineTransform()来创建一个2*3的矩阵,该矩阵传递给cv2.warpAffine()。该函数语法格式为:
retval = cv.getAffineTransform(src, dst) \'\'\' src:输入图像的三个点坐标 dst:输出图像的三个点坐标 三个点分别对应左上角、右上角、左下角 \'\'\'
查看如下放射变换实例:
import numpy as np import cv2 as cv img = cv.imread(r\'Lena.png\', 1) rows, cols, channels = img.shape p1 = np.float32([[0,0], [cols-1,0], [0,rows-1]]) p2 = np.float32([[0,rows*0.3], [cols*0.8,rows*0.2], [cols*0.15,rows*0.7]]) M = cv.getAffineTransform(p1, p2) dst = cv.warpAffine(img, M, (cols,rows)) cv.imshow(\'original\', img) cv.imshow(\'result\', dst) cv.waitKey(0) cv.destroyAllWindows()
效果图:
透视变换
上述仿射变换可以将矩形映射成任意平行四边形,各边仍保持平行;而透视变换可以将矩形映射为任意四边形,直线仍保持直线。
由于不再是平行四边形,需提供四个顶点。
透视变换通过函数cv2.warpPerspective()实现,语法为:
dst = cv.warpPerspective(src, M, dsize[, flags[, borderMode[, borderValue]]]) \'\'\' dst:透视后的输出图像,dsize决定输出图像大小 src:输入图像 M:3*3变换矩阵 flags:插值方法,默认为INTER_LINEAR borderMode:边类型,默认为BORDER_CONSTANT borderValue:边界值,默认为0 \'\'\'
透视变换通过函数cv2.getPerspectiveTransform()来生成转换矩阵,需输入输入图像和输出图像的四个顶点的坐标。
import numpy as np import cv2 as cv img = cv.imread(r\'Lena.png\', 1) rows, cols, channels = img.shape p1 = np.float32([[0,0], [cols-1,0], [0,rows-1], [rows-1,cols-1]]) p2 = np.float32([[0,rows*0.3], [cols*0.8,rows*0.2], [cols*0.15,rows*0.7], [cols*0.8,rows*0.8]]) M = cv.getPerspectiveTransform(p1,p2) dst = cv.warpPerspective(img, M, (cols, rows)) cv.imshow(\'original\', img) cv.imshow(\'result\', dst) cv.waitKey(0) cv.destroyAllWindows()
效果图:
以上是关于python-opencv几何变换--仿射变换透视变换的主要内容,如果未能解决你的问题,请参考以下文章
[Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)
OpenCV中的「透视变换 / 投影变换 / 单应性」—cv.warpPerspectivecv.findHomography