边缘检测算子的理解

最近学习canny和sobel,记录自己对其算子的理解

因为边缘是梯度变化的位置,在数学中可以用导数表示,
在这里插入图片描述
那么用算子就可以表示为 [1,-1] ,这样就可以表示用来f(x+1,y) - f(x,y)

这里记录几个算子,第一个就是Prewitt算子,表示如下:

在这里插入图片描述
可以看到这个算子是用了3x3的模板,因为如果用之前所说的1x2的算子,正好有两个像素的位置差距很大,那么带来的影响就比较大,为了减少个别点的影响,所以选择了大一点的模板。

接下来就是sobel算子,这也是canny算子的核心;这里解释一下为什么算子会有个2存在
在这里插入图片描述
其实sobel是先高斯平滑了一下,再做的边缘检测,可以看到下面这个图片,sobel算子可以表示如下(矩阵是可以分开计算的)
在这里插入图片描述
最后就是一个倾斜角度的边缘检测算子,如下图所示:Mx计算的是135°的边缘,而My计算的是45°的边缘。
在这里插入图片描述

下面是matlab对Prewitt算子和随机写的一个算子的理解

img = im2uint8(ones(100,100)); % 产生一个100*100的纯白色图片
img(:,45:75) = 0;  % 使图片的中间为黑色条纹
k1 = [-1 0 1;-1 0 1;-1 0 1];  % Prewitt算子
k2 = [-1 2 -1;-1 2 -1;-1 2 -1];  % 未命名算子
res = im2uint8(conv2(img,k2));
res(res < 0) = 0;
subplot(1,2,1);imshow(img);title("原图");
subplot(1,2,2);imshow(res);title("结果图");

利用Prewitt算子得到的结果如下所示,因为代码中使用的是con2函数,会自动padding,这个算子主要是检测中间边缘梯度变化的部分

在这里插入图片描述

而如果使用 k2 = [-1 2 -1;-1 2 -1;-1 2 -1]; 得到的就是如下图所示,还是因为padding的原因,请忽略结果图中最左最右两条白线
可以看到这里这个算子将黑白变化的边缘给表现出来了。

在这里插入图片描述


等后面还有更深的理解的话,再继续补充吧。

猜你喜欢

转载自blog.csdn.net/harryshumxu/article/details/122371613