Python OpenCV图像矫正:透视变换与轮廓检测实战

陈默
陈默
发布时间:2026-10-15 | 2人浏览过
原创

本文详解利用Python和OpenCV进行图像矫正的技术方案。核心通过cv2.warpPerspective实现透视变换,并介绍如何结合轮廓检测与cv2.approxPolyDP多边形逼近算法自动提取目标四个顶点,从而完成倾斜目标的自动扶正处理。

本文分享利用Python和OpenCV实现图像矫正的具体代码示例,供读者参考学习。

问题简介

在对图像中的目标进行分析和检测时,目标往往存在一定角度的倾斜。在自然环境中,完全正面向镜头的目标较为少见,因此将这些倾斜的目标“扶正”的过程被称为图像矫正。

透视变换demo

图像矫正的核心技术是透视变换。以下展示使用python-opencv进行透视变换的示例代码:

import cv2
import numpy as np

img = cv2.imread('/home/pzs/图片/1.jpeg')

result3 = img.copy()

img = cv2.GaussianBlur(img,(3,3),0)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

edges = cv2.Canny(gray,50,150,apertureSize = 3)
cv2.imwrite("canny.jpg", edges)

src = np.float32([[207, 151], [517, 285], [17, 601], [343, 731]])
dst = np.float32([[0, 0], [337, 0], [0, 488], [337, 488]])
m = cv2.getPerspectiveTransform(src, dst)
result = cv2.warpPerspective(result3, m, (337, 488))
cv2.imshow("result", result)
cv2.waitKey(0)

该过程主要调用cv2.warpPerspective()函数完成。

透视变换结果

透视变换的使用相对简单,关键在于如何准确获取目标的四个顶点坐标。

如何找到目标的4个顶点

获取这四个顶点的方法多样,例如可以采用直线检测、轮廓检测或最小外接矩形等算法。

这里演示使用轮廓检测的方式:

import cv2
import imutils

img = cv2.imread('1.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
dilate = cv2.dilate(blurred, cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)))
edged = cv2.Canny(dilate, 30, 120, 3)            # 边缘检测

cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  # 轮廓检测
cnts = cnts[0] if imutils.is_cv2() else cnts[1]  # 判断是opencv2还是opencv3
docCnt = None

if len(cnts) > 0:
    cnts = sorted(cnts, key=cv2.contourArea, reverse=True) # 根据轮廓面积从大到小排序
    for c in cnts:
        peri = cv2.arcLength(c, True)                                       # 计算轮廓周长
        approx = cv2.approxPolyDP(c, 0.02*peri, True)           # 轮廓多边形拟合
        # 轮廓为4个点表示找到纸张
        if len(approx) == 4:
            docCnt = approx
            break

for peak in docCnt:
    peak = peak[0]
    cv2.circle(img, tuple(peak), 10, (255, 0, 0))

cv2.imshow('img', img)
cv2.waitKey(0)

原理:

1、对图片进行轮廓检测 2、对检测出的轮廓进行多边形逼近 3、多边形为四边形且轮廓面积最大的图形为纸张 4、输出标记四个定点

cv2.approxPolyDP() 多边形逼近

重点讲解这个函数

作用:

对目标图像进行近似多边形拟合,使用一个较少顶点的多边形去拟合一个曲线轮廓,要求拟合曲线与实际轮廓曲线的距离小于某一阀值。

函数原形:

cv2.approxPolyDP(curve, epsilon, closed) -> approxCurve

参数:

curve : 图像轮廓点集,一般由轮廓检测得到 epsilon : 原始曲线与近似曲线的最大距离,参数越小,两直线越接近 closed : 得到的近似曲线是否封闭,一般为True

返回值:

approxCurve :返回的拟合后的多边形顶点集。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表