资讯专栏INFORMATION COLUMN

opencv python 图像缩放/图像平移/图像旋转/仿射变换/透视变换

dreambei / 1756人阅读

摘要:为了找到变换矩阵,我们需要输入图像中的三个点及其在输出图像中的相应位置。代码透视变换对于透视变换,需要一个变换矩阵。

Geometric Transformations of Images

1图像转换

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

2图像缩放

缩放只是调整图像大小.为此,OpenCV附带了一个函数cv.resize().
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

对shrinking,优选的interpolation方法:cv2.INTER_AREA该方法可以避免波纹的出现

对zooming,优选的interpolation方法:cv2.INTER_CUBICcv2.INTER_LINEAR(默认)

方法一

import numpy as np
import cv2

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

res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)

方法二

import numpy as np
import cv2

height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)
3图像平移

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

$$ M= left[ egin{matrix} 1 & 0 & tx 0 & 1 & ty end{matrix} ight] $$

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

应用

按(100,50)平移
代码

import cv2
import numpy 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()

4图像旋转

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

$$ M= left[ egin{matrix} cosθ & -sinθ sinθ & cosθ end{matrix} ight] $$

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

$$ left[ egin{matrix} alpha & eta & (1-alpha) cdot center.x - etacdot center.y -eta & alpha & etacdot center.x + (1-alpha) cdot center.y end{matrix} ight] $$

$ alpha = scale cdot cosθ $
$ eta = scale cdot sinθ $

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

应用

将图像相对于中心旋转90度而不进行任何缩放
代码

import cv2
import numpy as np

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

# cols-1 and rows-1 are the coordinate limits.
M = cv2.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))


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

5仿射变换

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

import cv2
import numpy as np
import matplotlib.pylab  as plt

img = cv2.imread("img5.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()

5透视变换

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

代码

import cv2
import numpy as np
import matplotlib.pylab  as plt

img = cv2.imread("img6.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()

NOTE
仿射变换和透视变换更直观的叫法可以叫做“平面变换”和“空间变换”或者“二维坐标变换”和“三维坐标变换”.
从另一个角度也能说明三维变换和二维变换的意思,仿射变换的方程组有6个未知数,所以要求解就需要找到3组映射点,三个点刚好确定一个平面.透视变换的方程组有8个未知数,所以要求解就需要找到4组映射点,四个点就刚好确定了一个三维空间.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41991.html

相关文章

  • Python 大白从零开始 OpenCV 学习课-5. 图像的几何变换

    摘要:从零开始学习课图像的几何变换本系列面向小白,从零开始实战解说项目实战。仿射变换仿射变换的特点是原始图像中的平行关系和线段长度比例关系保持不变。函数说明函数通过变换矩阵对图像进行仿射变换。 ...

    jay_tian 评论0 收藏0
  • opencv-python 详解图像的几何变换缩放平移旋转、翻转

    摘要:矩阵中的是向和方向平移的距离,举个例子,如果是向右平移个像素,向下平移个像素的话,那么变换矩阵平移是用仿射变换函数实现的参数含义输入图像。效果旋转旋转同平移一样,也是用仿射变换实现的,因此也需要定义一个变换矩阵。          目录 缩放 平移  旋转 翻转: 我们经常会用到图像的缩放...

    gecko23 评论0 收藏0
  • OpenCV-Python实战(4)——OpenCV常见图像处理技术(❤️万字长文,含大量示例❤️)

    OpenCV-Python实战(4)——OpenCV常见图像处理技术(❤️万字长文,含大量示例❤️) 0. 前言1. 拆分与合并通道2. 图像的几何变换2.1 缩放图像2.2 平移图像2.3 旋转图像2.4 图像的仿射变换2.5 图像的透视变换2.6 裁剪图像 3. 图像滤波3.1 应用滤波器(卷积核或简称为核)3.2 图像平滑3.2.1 均值滤波3.2.2 高斯滤波3.2.3 中值滤波3.2...

    Amos 评论0 收藏0
  • OpenCV图像处理--平面单应性

    图像几何变化 投影变换 投影变换 (Projective Transformation),是仿射变换的一般化,二者区别如下: 仿射变换 用途 旋转 (线性变换),平移(向量加).缩放(线性变换),错切,反转 方法 仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的平直性(直线经过变换之后依然是直线)和平行性(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点...

    sydMobile 评论0 收藏0
  • 2021-09-23 opencv学习笔记(图像变换,二值化,滤波器介绍及python实现)

    摘要:但是考虑一个双峰图像简单来说,双峰图像是一个直方图有两个峰值的图像。对于非双峰图像,二值化将不准确。在第三种情况下,我使用高斯核过滤图像以去除噪声,然后应用阈值。 ...

    CloudDeveloper 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<