@fuxianjun
本节对Canny边缘检测的步骤进行简单的介绍,希望帮助大家理解canny边缘检测的原理。
1) 使用高斯滤波器,以平滑图像,滤除噪声。
2) 计算图像中每个像素点的梯度强度和方向。
3) 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
4) 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
5) 通过抑制孤立的弱边缘最终完成边缘检测。
Canny函数及使用
OpenCV提供了函数cv2.Canny0来实现Canny边缘检测,其语法形式如下:
●edges = cv2. Cannedges为计算得到的边缘图像。
●image为8位输入图像。
●thresholdl 表示处理过程中的第一- 个阈值。
●threshold2 表示处理过程中的第二个阈值。
●apertureSize表示Sobel算子的孔径大小。
●L2gradient 为计算图像梯度幅度( gradient magnitude)的标识。其默认值为False。如果 为True,则使用更精确的L2范数进行计算( 即两个方向的导数的平方和再开方),否则使用L1范数(直接将两个方向导数的绝对值相加)。y( image, threshold1, threshold2[, apertureSize[, L2gradient1])
运用Canny
实战:车道检测
import cv2
import numpy as np
def canny(image):
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)#降低噪点
canny = cv2.Canny(blur,50,150)
return canny
def region_of_interest(image):#应用遮罩
height = image.shape[0]
ploygons = np.array([[(200,height),(1100,height),(550,250)]])
mask = np.zeros_like(image)
cv2.fillPoly(mask,ploygons,255)
masked_image = cv2.bitwise_and(image,mask)#通过bitwise_and对两个图像的每一个像素做与运算,来将遮罩应用图像
return masked_image
image = cv2.imread('test_image.jpg')
lane_image = np.copy(image)
canny=canny(lane_image)
cv2.imshow('canny',canny)
cv2.imshow('region_of_interest(canny)',region_of_interest(canny))
cv2.waitKey(0)