Opencv开源学习:边缘检测篇

如何开源:先cmake一下:CMake导出OpenCV源码生成VC++项目 - Latuper - 博客园

(一)先从感兴趣的边缘检测开始

边缘检测中,其中一阶边缘检测的算法有:prewitt、canny、sobel,二阶边缘检测算法有:laplace

1.Sobel边缘检测

sobel算子根据像素点的上下、左右邻点加权差,在边缘达到极值来达到边缘检测的目的。对噪声有平滑作用,可以提供较准确的边缘方向信息,但是对边缘检测的精度不高,适合于边缘检测精确要求不高的检测。

G_{x}=\begin{bmatrix} 1 &0 &-1 \\ 2& 0 &- 2\\ 1& 0&-1 \end{bmatrix}*AG_{y}=\begin{bmatrix} 1 &2 &1 \\ 0& 0 &0\\ -1& -2&-1 \end{bmatrix}*A

则x方向梯度进而计算

G_{x}=(1*f(x-1,y-1)+0*f(x,y-1)-1*f(x+1,y-1)+2*f(x-1,y)+0*f(x,y)-2*f(x-1,y)+1*f(x-1,y-1)+0*f(x,y-1)-1*f(x+1,y-1))=f(x-1,y-1)+2*f(x-1,y)+f(x-1,y-1)-(f(x+1,y-1)+2*f(x-1,y)+f(x+1,y+1))

同理对y方向梯度进行计算,这里不写推导过程

G_{y}=f(x-1,y-1)+2*f(x,y-1)+f(x+1,y-1) - (f(x-1,y+1)+2f(x,y+1)+f(x+1,y+1))

2..Canny边缘检测

canny检测的原理是:进行高斯滤波进行平滑;计算图像中每个像素点的方向和梯度;根据非极大值抑制,消除边缘检测带来的杂散响应;再根据双边阈值对真实潜在的边缘进行确定;通过阈值孤立弱边缘最终完成边缘检测。

(1)先进行高斯滤波

高斯滤波器与图像卷积,平滑滤除噪声,

这里高斯核的生成方程式为:H_{ij}=\frac{1}{2\pi \sigma ^{2}}exp(-\frac{((i-(k+1))^{2}+(j-(k+1))^{2})}{2\sigma ^{2}}),之后归一化高斯核

像素点的亮度值为 e = H * A。其中高斯滤波核的大小的选择影响canny的性能,尺寸越大对噪声的敏感度越低,但是定位误差会有所改善,其中5*5大小的不错。

(2)计算梯度的强度和方向

图像中的边缘可以指向各个方向,可以用边缘检测算子来返回边缘的值,如prewitt、sobel、robert等返回水平Gx和垂直Gy。sobel的处理方法可以像上面说的sobel检测那样计算点的像素值,Gx=Sx*A , Gy= Sy*A

(3)非极大值抑制

对于刚刚的梯度计算之后,边缘还是存在不清晰的现象,因此还需要进一步对边缘进行限定。非极大值抑制可以将局大值之外的抑制为0,具体的将当前像素强度的梯度与另外两个相比,它最大的话保留,小的话抑制。

如上图所示,c是我们进行判断去留的点,它的梯度方向是左图中的斜线方向。这里要比较的是斜线与上下直线相交的dTmp1以及dTmp2点的梯度。要计算dTmp1和dTmp2的梯度,找出c点中8邻域中靠近的4个点g1、g2、g3、g4。利用比例关系计算梯度

M(dTmp1)=w*M(g2)+(1-w)*M(g1) ,其中w=distance(dTmp1,g2)/distance(g1,g2)  ;同理算出dTmp2。这样比较之后判断是保留c点还是抑制c点。

(4)双边阈值

但是经过上面的极大值抑制后还是会存在噪声等干扰。因此这里用双边阈值来抑制。Canny算法利用双阈值,一个高阈值一个低阈值来区分边缘像素,如果边缘像素梯度大于高阈值,则为强边缘点,如果边缘像素梯度小于低阈值,则为弱边缘点。其中,弱边缘点被抑制掉。应该是因为噪声的干扰大多情况下没有真边缘表现的那么强的原因。

一般在双边阈值之后Canny边缘提取就结束了。但是其实在双边阈值中被抑制掉的弱边缘点可能是真的边缘,这样对边缘提取的准确性会有影响。这里还可以进行一步,滞后边界追踪,这里利用弱边缘点的8连通域像素来进行判断,如果8连通域内存在强边缘点,则弱边缘点被当作真的边缘点保留下来。

(二)再放一个阈值分割

1.大津阈值分割(最大类间方差法)

按灰度特性,将图像分成前景和目标。前景和目标的类间方差越大,则构成此图的两部分的差别越大。例记为ω0,其平均灰度μ0;背景像素点数占整幅图像的比例为ω1,其平均灰度为μ1。图像的总平均灰度记为μ,类间方差记为g。假设图像的背景较暗,并且图像的大小为M×N,图像中像素的灰度值小于阈值T的像素个数记作N0,像素灰度大于阈值T的像素个数记作N1,则有

                        ω0=N0/ M×N (1)
      ω1=N1/ M×N (2)
      N0+N1=M×N (3)
      ω0+ω1=1 (4)
      μ=ω0*μ0+ω1*μ1 (5)
      g=ω0(μ0-μ)^2+ω1(μ1-μ)^2 (6)

参考文献:https://blog.csdn.net/jmu201521121021/article/details/80622011#参考链接

                    [图像处理] Sobel边缘检测算法_RyuZhihao123的博客-CSDN博客_sobel边缘检测算法

                    图像处理算法基础(十)---大津法求最佳分割阈值_Einstein_liu的博客-CSDN博客_大津法求阈值

                   图像处理——Canny算子_fengye2two的博客-CSDN博客_canny算子

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值