提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
案例来源于© Fu Xianjun. All Rights Reserved
前言
灵活运用平滑处理、边缘检测、轮廓检测、透视变换、坐标点处理。
学会轮廓对比方法,并得到统计分析结果,以及综合应用数字图像处理知识解决实际问题。
1.引入库
代码如下(示例):
1.预处理,轮廓检测
import cv2
import numpy as np
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
ANSWER_KEY = {
0:1,1:4,2:0,3:3,4:1}
img = cv2.imread("test_01.png")
contours_Img = img.copy()
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#灰度图
blur = cv2.GaussianBlur(gray,(5,5),0)#高斯(平滑处理)
edge = cv2.Canny(blur,75,200)#边缘检测
#轮廓检测
cnts,h = cv2.findContours(edge,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#外边缘
#cnts = cv2.findContours(edge,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)【0】功能一样
cv2.drawContours(img,cnts,-1,(0,255,0),2)#绘制轮廓
cv_show("img",img)
结果如下:
代码如下(示例):
2.轮廓排序,透视变换
def order_points(pts):
rect = np.zeros((4,2),dtype="float32")#四个点两个坐标,浮点型参数
s = pts.sum(axis=1)#求和,根据y坐标提取参数
rect[0] = pts[np.argmin(s)]#水平方向最小值的下标(左上角)
rect[2] = pts[np.argmax(s)]#右下角
d = np.diff(pts,axis=1)#做减法的意思
rect[1]= pts[np.argmin(d)]#右上角
rect[3]= pts[np.argmax(d)]#左下角
return rect
#四点矫正函数
def four_point_transform(img,pts):
rect = order_points(pts)#用上面的函数排序
(tl,tr,br,bl) = rect#把rect拆分成四个点
widthA = np.sqrt(((br[0] - bl[0])**2)+((br[1] - bl[1])**2))
#y2-y1的平方+x2-x1的平方再开根号
widthB = np.sqrt(((tr[0] - tl[0])**2)+((tr[1] - tl[1])**2))
maxWidth = max(int(widthA),int(widthB))
heightA = np.sqrt(((tr[0] - br[0])**2)+((tr[1] - br[1])**2))
heightB = np.sqrt(((tl[