python opencv图像矫正
DanCheng-studio 人气:0问题简介
一般的我们对图像中的目标进行分析和检测时,往往目标具有一定的倾斜角度,自然环境中正面向我们的目标实际是很少的,那将这些倾斜的目标“扶正”的过程就就叫做图像矫正。
透视变换demo
图像矫正使用的主要技术是透视变换。
python-opencv 透视变换demo如下:
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个顶点。
如何找到目标的4个顶点
如何找到这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 :返回的拟合后的多边形顶点集。
加载全部内容