Python OpenCV超详细讲解透视变换的实现
简介
透视变换是计算机视觉中一种重要的图像处理技术,通过透视变换可以对图像进行几何变换从而得到需要的图像形式。OpenCV的图片处理库中提供了cv2.warpPerspective函数来完成透视变换的处理,本文将详细讲解透视变换的具体实现过程。
实现透视变换的具体步骤
- 读取需要进行透视变换的原始图像,可以使用OpenCV的cv2.imread()函数来读取。
import cv2
img = cv2.imread("input.jpg")
- 根据原图像中需要进行变换的四个点的坐标值,使用cv2.getPerspectiveTransform()函数得到透视变换矩阵M。
import numpy as np
# 坐标点顺序为左上、右上、右下、左下
src_points = np.array([(200, 200), (600, 200), (600, 500), (200, 500)])
dst_points = np.array([(300, 100), (500, 100), (500, 400), (300, 400)])
M = cv2.getPerspectiveTransform(src_points, dst_points)
- 对读取到的原始图像进行透视变换,使用cv2.warpPerspective()函数来实现。
output_img = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0]))
- 最后将处理后的图像保存到本地,可以使用OpenCV的cv2.imwrite()函数来保存。
cv2.imwrite("output.jpg", output_img)
示例1:透视变换实现公文校正
在这个示例中,我们将使用透视变换处理照片上的公文纸张,将其校正为水平状态。
- 读入需要处理的公文照片,并使用cv2.resize()函数将其缩小一半。
img = cv2.imread("paper.jpg")
img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5)
- 使用cv2.Canny()函数进行边缘检测,并使用cv2.dilate()函数对边缘进行膨胀处理,增加边缘的宽度以便接下来的轮廓检测。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 30, 100)
kernel = np.ones((5, 5), np.uint8)
dilated_edges = cv2.dilate(edges, kernel, iterations=1)
- 使用cv2.findContours()函数来查找轮廓,并使用cv2.drawContours()函数来绘制轮廓。
contours, _ = cv2.findContours(dilated_edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 255, 0), 2)
- 针对得到的轮廓点进行筛选和排序,得到顶点坐标。
contour = contours[0]
epsilon = 0.02 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)
sorted_points = sort_points(approx)
- 获取一个与原始图像大小相同的黑色画布,并使用cv2.fillPoly()函数绘制出透视变换的区域。
black = np.zeros((img.shape[0], img.shape[1], 3), np.uint8)
cv2.fillPoly(black, [sorted_points], (255, 255, 255))
- 利用cv2.getPerspectiveTransform()函数得到透视变换矩阵并应用它到原始图像上。
M = cv2.getPerspectiveTransform(sorted_points.astype(np.float32), np.array([(0, 0), (black.shape[1], 0), (black.shape[1], black.shape[0]), (0, black.shape[0])], np.float32))
output = cv2.warpPerspective(img, M, (black.shape[1], black.shape[0]), flags=cv2.INTER_LINEAR)
- 将处理后的结果保存到本地。
cv2.imwrite("output.jpg", output)
示例2:透视变换实现图像拼接
在这个示例中,我们将使用透视变换将两张图像拼接在一起。
- 读取需要拼接的两张图像。
img1 = cv2.imread("1.jpg")
img2 = cv2.imread("2.jpg")
- 根据两张图像中需要进行拼接的四个点的坐标值,使用cv2.getPerspectiveTransform()函数得到透视变换矩阵M。
src_points = np.array([(313, 137), (827, 135), (1077, 765), (76, 763)])
dst_points = np.array([(0, 0), (img1.shape[1], 0), (img2.shape[1],img2.shape[0]), (0, img1.shape[0])])
M = cv2.getPerspectiveTransform(src_points, dst_points)
- 对读取到的原始图像进行透视变换,使用cv2.warpPerspective()函数来实现。
output = cv2.warpPerspective(img2, M, (img2.shape[1], img1.shape[0]))
- 进行图像拼接,使用cv2.addWeighted()函数将两张图像进行融合拼接。
result = cv2.addWeighted(img1, 1, output, 1, 0)
- 最后将处理后的图像保存到本地,可以使用OpenCV的cv2.imwrite()函数来保存。
cv2.imwrite("result.jpg", result)
总结
通过以上示例可以看出,利用OpenCV实现透视变换并不复杂。首先需要获得需要变换的四个点的坐标值,然后计算透视变换矩阵M,最后利用cv2.warpPerspective()函数将原始图像进行变换,实现各种需要的图像处理效果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python OpenCV超详细讲解透视变换的实现 - Python技术站