opencv中文文档

opencv中文文档


图像几何变换

<h1>目标</h1> <p>学习将不同的几何变换应用于图像的平移、旋转、仿射变换等。 您将看到这些函数:cv.getPerspectiveTransform</p> <h1>转换</h1> <p>OpenCV提供了两个转换函数cv.warpAffine和cv.warpPerspective,您可以使用它进行各种转换。简历。翘曲仿射取2x3变换矩阵,cv。warpPerspective以一个3x3变换矩阵作为输入。</p> <h3>缩放</h3> <p>缩放就是调整图像的大小。OpenCV附带了一个函数cv.resize()。可以手动指定图像的大小,也可以指定缩放因子。使用了不同的插值方法。较好的插值方法是cv.INTER_AREA用于收缩和cv.INTER_CUBIC(慢速)&amp; cv.INTER_LINEAR缩放。默认情况下,使用的插值方法是cv.INTER_LINEAR用于所有调整大小的目的。您可以调整输入图像的大小以下方法之一:</p> <pre><code class="language-python">import numpy as np import cv2 as cv img = cv.imread('messi5.jpg') res = cv.resize(img,None,fx=2, fy=2, interpolation = cv.INTER_CUBIC) #OR height, width = img.shape[:2] res = cv.resize(img,(2*width, 2*height), interpolation = cv.INTER_CUBIC)</code></pre> <h3>平移</h3> <p>平移是物体位置的移动。如果已知(x,y)方向的位移,令其为(tx,ty),则可以建立变换矩阵M如下:</p> <p>您可以将其放入类型为np.Numpy数组中。然后将其传递给cv.warpAffine()函数。参见下面的例子(100,50):</p> <pre><code class="language-python">import numpy as np import cv2 as cv img = cv.imread('messi5.jpg',0) rows,cols = img.shape M = np.float32([[1,0,100],[0,1,50]]) dst = cv.warpAffine(img,M,(cols,rows)) cv.imshow('img',dst) cv.waitKey(0) cv.destroyAllWindows()</code></pre> <p>cv.warpaffine()函数的第三个参数是输出图像的大小,其形式应该是<strong>(宽、高)</strong>。记住宽度=列数,高度=行数。</p> <p>结果如下: <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/9ddb3f4fc554c8a895143500f0ce833f?showdoc=.jpg" alt="" /></p> <h3>旋转</h3> <p>图像的旋转一个角度θ是通过变换矩阵的形式</p> <p>但是OpenCV提供了可调节旋转中心的缩放旋转,所以你可以在任何你喜欢的位置旋转。修正后的变换矩阵由</p> <p>为了找到这个转换矩阵,OpenCV提供了一个函数cv.getRotationMatrix2D。检查下面的例子,它旋转图像90度相对于中心没有任何缩放。</p> <pre><code class="language-python">img = cv.imread('messi5.jpg',0) rows,cols = img.shape # cols-1 and rows-1 are the coordinate limits. M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1) dst = cv.warpAffine(img,M,(cols,rows))</code></pre> <p>结果如下: <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/d1f2a25fed669d494b47aa78e3ab3e43?showdoc=.jpg" alt="" /></p> <h3>仿射变换</h3> <p>在仿射变换中,原图像中的所有平行线在输出图像中仍然是平行的。为了找到变换矩阵,我们需要从输入图像中选取三个点,以及它们在输出图像中的对应位置。然后简历。getAffineTransform将创建一个2x3矩阵,该矩阵将被传递给cv.warpAffine。</p> <p>检查下面的例子,也看看我选择的点(用绿色标记):</p> <pre><code class="language-python">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') plt.show()</code></pre> <p>查看结果: <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/7cc261ff90467f54ae68d3e8a7bdb15e?showdoc=.jpg" alt="" /></p> <h3>透视变换</h3> <p>对于透视变换,你需要一个3x3的变换矩阵。直线在变换之后仍然是直线。要找到这个变换矩阵,需要输入图像上的4个点和输出图像上的对应点。在这4个点中,有3个点不应该是共线的。然后通过函数cv. getperspective tiveTransform可以找到变换矩阵。然后应用 cv.warpPerspective。用这个3x3转换矩阵</p> <p>请参阅以下代码:</p> <pre><code class="language-python">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()</code></pre> <p>结果: <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/73d7fa8a579fba415bda890954ad13df?showdoc=.jpg" alt="" /></p> <h1>其他资源</h1> <ol> <li>&quot;计算机视觉:算法与应用&quot;,Richard Szeliski著</li> </ol>

页面列表

ITEM_HTML