Canny算法介绍:
canny算法详解
可供参考
1. GaussianBlur
2. 灰度转换:cvtcolor
3. 计算梯度:Sobbel/Scharr
4. 非最大信号抑制:
寻找局部像素最大点,剔除很多非边缘点。
5. 高低阈值输出二值图像:
减少假边缘段数量的典型方法是对N[i,j]使用一个阈值。将低于阈值的所有值赋零值。但问题是如何选取阈值? 解决方法:双阈值算法。双阈值算法对非极大值抑制图象作用两个阈值τ1和τ2,且2τ1≈τ2,从而可以得到两个阈值边缘图象N1[i,j]和N2[i,j]。由于N2[i,j]使用高阈值得到,因而含有很少的假边缘,但有间断(不闭合)。双阈值法要在N2[i,j]中把边缘连接成轮廓,当到达轮廓的端点时,该算法就在N1[i,j]的8邻点位置寻找可以连接到轮廓上的边缘,这样,算法不断地在N1[i,j]中收集边缘,直到将N2[i,j]连接起来为止。在连接边缘的时候,用数组模拟队列的实现。以进行8-连通域搜索。
opencv中的演示:
def edge_demo(image):
blurred = cv.GaussianBlur(image, (3,3), 0);
#GaussianBlur reduce nosie cause canny is noise sensitivity
gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY);
# X Gradient
xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0);
ygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1);
edge_output = cv.Canny(xgrad, ygrad, 50, 150);
cv.imshow("edge_dmeo", edge_output);
dst = cv.bitwise_and(image, image, mask = edge_output);
cv.imshow("color_edge_demo", dst);
Canny():这是一个重载函数;我们用到的这种参数选择制定图片像素大小为16位导数,所以我们用
CV_16SC1进行初始化。