Python Opencv基于透视变换的图像矫正
下面是基于透视变换的图像矫正的完整攻略。
概述
在某些情况下,图像会因为多种因素导致出现透视扭曲,这时需要对图像进行矫正。OpenCV是一款开源的计算机视觉库,在其中包含了很多图像矫正相关的函数,其中就包括基于透视变换的图像矫正。
基本原理
透视变换是指在三维空间中进行投影变换的过程。在图像中,我们可以利用四个点确定一个矩形区域,进而通过透视变换把这个区域变换为一个矩形。基于这个原理,可以实现图像矫正的目的。
步骤
- 确定需要矫正的区域的四个顶点坐标。
- 通过
cv2.getPerspectiveTransform()函数得到变换矩阵。 - 通过
cv2.warpPerspective()函数将图像进行透视变换。
代码示例
示例1
这个示例来自iWatermelon的博客,用于将图片中的某一区域翻正。
import cv2 import numpy as npimport mathimg = cv2.imread('image.jpg')h,w = img.shape[:2] print(h,w)X1 = 315Y1 = 138X2 = 628 Y2 = 239X3 = 535 Y3 = 389X4 = 203Y4 = 248def get_points(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONUP: print(x, y)cv2.namedWindow('image') cv2.setMouseCallback('image',get_points) cv2.imshow('image',img) cv2.waitKey(0)cv2.destroyAllWindows() """h, w = 704, 896Point1 = [315, 138]Point2 = [628, 239]Point3 = [535, 389]Point4 = [203, 248]"""src = np.float32([[X1,Y1],[X2,Y2],[X3,Y3],[X4,Y4]])dst = np.float32([[0,0],[w-1,0],[w-1,h-1],[0,h-1]])M = cv2.getPerspectiveTransform(src,dst)result=cv2.warpPerspective(img,M,(w,h))cv2.imshow('img',result)cv2.waitKey(0)cv2.destroyAllWindows()示例2
这个示例来自opencv官方文档,用于将图片中的书本翻正。
import cv2import numpy as npimg = cv2.imread('book.jpg')rows, cols, ch = img.shapepts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])pts2 = np.float32([[0, 0], [300, 0], [0, 500], [300, 500]])M = cv2.getPerspectiveTransform(pts1, pts2)dst = cv2.warpPerspective(img, M, (300, 500))cv2.imshow('original', img)cv2.imshow('book', dst)cv2.waitKey(0)cv2.destroyAllWindows()总结
基于透视变换的图像矫正可以实现一些特定的图像处理需求,它主要包含了确定矫正区域、求解变换矩阵和透视变换三个步骤。在OpenCV中,我们可以使用cv2.getPerspectiveTransform()和cv2.warpPerspective()函数实现透视变换。其中cv2.getPerspectiveTransform()用于求解变换矩阵,cv2.warpPerspective()用于执行透视变换。