【图像处理】sobel算子简述

sobel算子是什么

在图像处理上,算子一般也可以认为是滤波器,即filter,滤波器就是在一个像素点上对它进行与邻域之间的运算。

如中值滤波,就是在以像素点为中心,上下左右左上左下右上右下为邻域的集合里,如下图所示结构:

这里写图片描述

中值滤波就是对P1到P9进行排序,然后获取数值大小排在中间的值,把这个值当做该中心像素点P5的新值。

而sobel算子,是为了用来计算边缘的,一般而言,以3x3为大小,有下面这两种形式,Gx和Gy,Gx用来计算垂直边缘,Gy用来计算水平边缘。

通常混合使用,会有 |G| = |Gx| + |Gy|,绝对值用于消除梯度方向的影响。

这里写图片描述

如果按照上面P1到P9的排列,那么有:

Gx = |(P3+2P6+P9) - (P1+2P4+P7)|
Gy = |(P1+2P2+P3) - (P7+2P8+P9)|

这样的形式很好理解,假如中间为边缘,那么边缘两侧的亮度差距就会变大,乘以符号相反的系数,会使得最终的结果达到很大的值,在图像上来看就是白色;而不是边缘的区域,左右两边或者上下两边就会抵消,在图像上看就是黑色。

代码实现

这里比较简单就不赘述了。

主要是直接运用上面的算术关系,对每一个点进行换算。然后遍历整张图像就可以了。

后续在进行NEON优化时再做比较。

temp=abs(ptr[0]+2*ptr[1]+ptr[2]-(ptr[6]+2*ptr[7]+ptr[8]))+
abs(ptr[2]+2*ptr[5]+ptr[8]-(ptr[0]+2*ptr[3]+ptr[6]));


需要注意的是:在按照上述代码处理图像时,经sobel算子滤波之后,得到的图像与opencv中Sobel()函数得到的不一致。
经查看opencv源码,发现:主要是我们在处理时采用了abs()绝对值操作。而opencv是没有用绝对值,并且会对输出的图像做饱和处理,即大于255则输出为255,小于0则输出为0.

参考资料

http://homepages.inf.ed.ac.uk/rbf/HIPR2/sobel.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值