OpenCV篇5---图像的几何变换

学习目标:

1、学习对图像应用不同的几何变换,如平移,旋转,仿射变换等;

2、学习函数:cv2.getPerspectiveTransform。

1、转换:

OpenCV提供了两个转换函数,cv2.warpAffine和cv2.warpPerspective,可以进行各种转换。 cv2.warpAffine采用2x3变换矩阵,而cv2.warpPerspective采用3x3变换矩阵作为输入。

2、缩放:

缩放只是调整图像大小。 OpenCV为此提供了函数cv2.resize()。 图像的大小可以手动指定,也可以指定比例因子。 使用不同的插值方法。 优选的插值方法是用于缩小的cv2.INTER_AREA和用于缩放的cv2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。 默认情况下,对于所有调整大小的目的,使用的插值方法是cv2.INTER_LINEAR。 您可以使用以下方法调整输入图像大小:

范例(放大原始图像的2倍):

#coding:utf8
import cv2

img = cv2.imread('F:/picture.jpg')
print ("原始图像尺寸的大小:", img.shape)
#方法1
res = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
print ("方法1缩放之后尺寸的大小:", res.shape)
#方法2
height, width = img.shape[:2]
res = cv2.resize(img, (2*width, 2*height), interpolation=cv2.INTER_CUBIC)
print ("方法2缩放之后尺寸的大小:", res.shape)

输出:

原始图像尺寸的大小: (280, 450, 3)
方法1缩放之后尺寸的大小: (560, 900, 3)
方法2缩放之后尺寸的大小: (560, 900, 3)

3、图像的偏移:

变换矩阵M:

#coding:utf8
import cv2
import numpy as np
img = cv2.imread('F:/picture.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()

输出:


4、旋转:

通过形式的变换矩阵来实现对图像进行θ角度的旋转


但OpenCV提供缩放旋转,旋转中心可调,以便您可以在任何您喜欢的位置旋转。 修改后的变换矩阵由下式给出

              注意:        

为了找到这个转换矩阵,OpenCV提供了一个函数cv2.getRotationMatrix2D。 请检查下面的例子,它将图像相对于中心旋转90度,而不进行任何缩放。

实现代码:

#coding:utf8
import cv2
import numpy as np
img = cv2.imread('F:/picture.jpg', 0)
rows, cols = img.shape
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img, M, (cols,rows))
cv2.imshow('original', img)
cv2.imshow('result', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出(注意:这种方法会在旋转之后显示的图像不完整):

5、仿射变换

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

实现代码:

#coding:utf8
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('F:/picture.jpg')
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()

输出:


6、透视转化

对于透视变换,您需要一个3x3变换矩阵。 即使在改造之后,直线仍将保持直线。 要找到这个变换矩阵,您需要输入图像上的4个点和输出图像上的对应点。 在这4点中,其中3个不应该在线。 然后可以通过函数cv2.getPerspectiveTransform找到变换矩阵。 然后将cv2.warpPerspective应用于这个3x3转换矩阵。

实现代码:

#coding:utf8
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('F:/picture.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
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Opencv-python图像变换是通过使用不同的变换矩阵来实现的。其中,平移是一种最简单的空间变换。使用Opencv的函数cv2.warpAffine()可以实现平移操作。在代码中,我们需要定义一个变换矩阵M,这个矩阵是一个2行3列的矩阵,决定了平移的方式。其中,M矩阵中的tx和ty分别表示在x和y方向上平移的距离。更具体地说,如果我们向右平移tx个像素,向下平移ty个像素,那么变换矩阵M的定义如下: import numpy as np rows, cols = img.shape[:2] M = np.float32([[1, 0, tx], [0, 1, ty]]) dst = cv2.warpAffine(img, M, (cols, rows)) 在上述代码中,我们使用了NumPy库来创建一个2x3的浮点型变换矩阵M,并将其传递给cv2.warpAffine()函数,该函数会将图像img按照定义的方式进行平移,并生成一个新的图像dst。最后,我们可以通过cv2.imshow()函数显示平移后的图像。 除了平移之外,Opencv还提供了其他的图像变换操作,比如缩放。缩放可以按照指定的宽度和高度来调整图像的大小,也可以按照比例来进行缩放。通过cv2.resize()函数可以实现缩放操作。在代码中,我们可以使用下面的方式来进行缩放操作: import cv2 img = cv2.imread('drawing.jpg') # 按照指定的宽度、高度缩放图片 res = cv2.resize(img, (width, height)) # 按照比例缩放图片 res2 = cv2.resize(img, None, fx=scale_x, fy=scale_y, interpolation=cv2.INTER_LINEAR) 在上面的代码中,我们首先使用cv2.imread()函数读取图像,并将其存储在变量img中。然后,我们可以使用cv2.resize()函数来调整图像的大小。其中,如果我们指定了宽度和高度,那么图像将按照这些指定的大小进行缩放;如果我们指定了fx和fy的比例因子,那么图像将按照这些比例进行缩放。最后,我们可以使用cv2.imshow()函数来显示缩放后的图像。 总结起来,Opencv-python提供了多种图像变换操作,包括平移、缩放等。通过使用相应的函数和变换矩阵,我们可以实现对图像的各种变换操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [opencv-python 详解图像几何变换缩放、平移、旋转、翻转](https://blog.csdn.net/RayChiu757374816/article/details/120036004)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值