边缘检测
边缘检测(edge detection)指的是检测图片中亮度等发生剧变或不连续的边缘和线条的各种数学方法。
它是图像处理(image processing),计算机视觉(computer vision)中的基本工具,尤其是在特征检测(feature detection)和特征提取(feature extraction)方面应用较多。
简单实现
首先我们读入待处理的图片:
import cv2 as cv
img = cv.imread('d:/OpenCV/market.jpg')
cv.imshow('Image',img)
cv.waitKey(3000)
图片显示如下:
边缘检测的方法或边缘检测器(edge detector),种类很多,接下来我们将使用其中很常见的Canny检测器:
canny = cv.Canny(img,125,175)
cv.imshow('Canny Edges',canny)
cv.waitKey(3000)
我们直接使用OpenCV中的Canny()
函数进行边缘检测。这个函数有多个参数:
- 第一个参数是待处理的图片;
- 第二、三个参数是两个界限(threshold),其中较小的用来进行边缘连接,较大的用来寻找明显的边缘;
- 其他参数这里没有用到。
检测出的边缘(edges)显示如下:
然而,正如图片所示,我们得到的edges数量过多过杂,不利于之后的识别等高级操作。所以我们需要想办法将检测到的边缘的数量降下来,只保留“关键的”edges。
高斯模糊
我们首先使用高斯模糊(Gaussian Blur)对图片进行一定的模糊:
blur = cv.GaussianBlur(img, (7, 7), cv.BORDER_DEFAULT)
cv.imshow('Blur',blur)
cv.waitKey(3000)
这里,我们直接使用OpenCV中的函数GaussianBlur()
:
- 第一个参数是需要进行模糊的图片
- 第二个参数是高斯核的大小(Gaussian kernel size)
- 第三个参数是高斯kernel在x轴方向的标准差
- 其他参数没有用到。
对于初学者,只需知道通过调整kernel size的大小,可以改变图片模糊的程度,即kernel size越大,图片越模糊。
处理的结果如下:
在做完高斯模糊后,我们再对其进行边缘检测:
canny1 = cv.Canny(blur, 125, 175)
cv.imshow('Canny Edges After Blur', canny1)
cv.waitKey(3000)
结果如下:
可以发现,我们检测到的edges变少了,我们便能够对图片上物品的层次结构有更清楚的认识,之后进行其他高级操作就会更加方便和准确。