opencv python教程简书_OpenCV-Python教程:12.图片的几何转换

转换

OpenCV提供了两个转换函数,cv2.warpAffine和cv2.warpPerspective,通过他们你可以进行各种转换,cv2.warpAffine接受2x3的转换矩阵二cv2.warpPerspective接受3x3的转换矩阵做为输入。

缩放

OpenCV有一个函数cv2.resize()来干这个,图片的大小可以人工指定,或者你可以指定缩放因子。有不同的差值方式可以使用,推荐的插值方法是缩小时用cv2.INTER_AREA,放大用cv2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默认情况下差值使用cv2.INTER_LINEAR。你可以使用下面两种方法来改变图片大小:import cv2

import numpy as np

img = cv2.imread('messi5.jpg')

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)

平移

平移是改变物体的位置。如果你知道在(x, y)方向的变化是(tx, ty),你可以创建转换矩阵M:

1c6512d475cc

你可以把它变成Numpy的数组,类型是np.float32的,然后把它传给cv2.warpAffine()函数,下面的例子平移(100, 50):import cv2

import numpy as np

img = cv2.imread('messi5.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', dst)

cv2.waitKey(0)

cv2.destroyAllWindows()

警告:

cv2.warpAffine()函数的第三个参数是输出图片的大小,应该是(width, height)的形式,记住width=列数,height=行数

旋转

对一个图片旋转一个θ角是通过下面这个形式的转换矩阵实现的:

1c6512d475cc

但是OpenCV提供了可选中心的缩放旋转,所以你可以按任意点旋转。转换矩阵变为:

1c6512d475cc

其中:

1c6512d475cc

要找到这个转换矩阵,OpenCV提供了一个函数,cv2.getRotationMatrix2D。看下面的例子,把图片旋转了90度img = cv2.imread('messi5.jpg', 0)

rows, cols = img.shape

M = cv2.getRotationMatrix2D((cols/2,rows/2), 90, 1)

dst = cv2.warpAffine(img, M, (cols, rows))

结果:

1c6512d475cc

仿射变换

在仿射变换里,所有原始图片里的平行线在输出的图片里仍然平行,要找到转换矩阵,我们需要输入图片的三个点,和他们在输出图片里的对应位置,然后cv2.getAffineTransform会创建一个2x3的矩阵,然后把这个矩阵传给cv2.warpAffine.

看下面的例子,注意我选的三个点(绿色的点)img = cv2.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 = cv2.getAffineTransform(pts1, pts2)

dst = cv2.warpAffine(img,M,(cols, rows))

plt.subplot(121), plt.imshow(img), plt.title('Input')

plt.subplot(122), plt.imshow(dst), plt.title('Output')

plt.show()

结果:

1c6512d475cc

透视变换

对于透视变换,你需要一个3x3的转换矩阵。转换后直线仍然保持直线。要得到这个转换矩阵,你需要输入图片上的4个点,以及输出图片上对应的点。在这四个点中,3个不能同线。然后cv2.getPerspectiveTransform函数就能得到转换矩阵了,再用cv2.warpPerspective来接收这个3x3的转换矩阵。

代码:img = cv2.imread('sudokusmall.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 = 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()

1c6512d475cc

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值