Canny边缘检测部分步骤思考

来源:互联网 发布:电脑桌面淘宝下载 编辑:程序博客网 时间:2024/06/16 15:17

用OpenCV写的一次作业,打算是重下canny这个函数,然后稍微理一下有一点点自己思考的部分(没有代码因为拖延症并没有在ddl前把它写完……)

非极大值抑制

1.线性插值

这种方法第一眼看到觉得很神奇……不过在维基和OpenCV的官网上用到的方法都不是这一种。
这一步会对使用线性插值或对方向离散化性能和实现的比较。分析了一下觉得意义不大就没有实现……因为要加很多运算量。
一个是之前偷懒想的可以不用开根号,一旦用了这种方法直接计算就不是线性插值了……另一个是看了一下Sobel算子得到的结果,发现在比如22.5、67.5附近的不算多,感觉对于整体结果影响不会非常大。而且一旦实现这个过程,要多出两条三角函数的运算,感觉意义不大。

2.对方向离散化

伪代码:

pi_4 = atan(1);    // 得到PI/4的值mode = (atan(gradY / gradX) + pi_4 * 5 / 2) / pi_4;   //离散化

这里对于gradX为零单独处理。
还有一个就是负数除法和正数不一样orz
然后要是要提高效率应该可以直接根据gradY / gradX来计算不需要求出arctan。

双阈值

直接指定阈值对阈值进行测试。
计算梯度的直方图,这样可以直接规定(前30%是强边界,前70%是弱边界)等,或许可以实现对图像更好的控制。
此外还有使用大津算法来确定。这是一种区分前景和背景的算法,求出的阈值为高阈值,高阈值的1/2为低阈值[1]。

检测和连接边缘

1.函数迭代

预告一下用这种方法直接毫无悬念的直接stackoverflow了。反正我写的连Lena都跑不动……直接弃了。

For all strong edge point i:   Function addpoint(i);Function addpoint(i):   If i is a week edge:      add i in the edge;   For point j around point i:      addpoint(j);

2.图像膨胀

这种方法就是,类似形态学运算,就是相当于一次次膨胀,然后每次膨胀完除掉不可能是边界的点再一次膨胀。

Flag = false;while (Flag)    Flag = false;    for every weak edge i:        for point j around point i:            If j is a strong edge:                 add i in the edge;                 Flag = true;   // 没有再次更新的时候停止

算法复杂度应该在O((m*n)^2),在低阈值和高阈值相差越大的时候运算会越慢,当两个值相近的时候膨胀次数少,很快就能结束。

3.递归

是对函数迭代的一种简化。

For all strong edge point i:    Stack.push(i);while(stack is not empty):    i = stack.pop();    for point j around point i:       if j is a week edge:          add j in the edge;          Stack.push(j);

这种方法的算法复杂的读应该在O(m*n),因为一个点最多入栈出栈8次(周围有8个点)。

4.图形学处理

这个是根据之前的图形学想到的。其实strong edge相当于起始的着色点。然后判断不是edge的可以认为是边界。然后在这种情况下可以大大减少上一种情况的入栈的点。
这种算法的基础应该是按行进行操作。每一行连通的点可以认为是用最左侧的点代表。每次入栈的是上下行的第一个。
计算机图形学第三版
虽然这种算法应该不是特意为这种有一堆初始点的情况写的但至少比我想到的前一种算法肯定快(x)

Reference

[1]https://en.wikipedia.org/wiki/Canny_edge_detector
维基 算法的总体思路归纳
[2]https://docs.opencv.org/3.3.1/da/d5c/tutorial_canny_detector.html
OpenCV的Canny函数官方文档
[5]http://www.cnblogs.com/love6tao/p/5152020.html
根据百分比确定阈值
[6]http://blog.csdn.net/likezhaobin/article/details/6892176
插值的思想

原创粉丝点击