1. 前言
继续优化技术的探索,今天以一个3×33\times 33×3的Sobel算子进行边缘检测的算法为例来看看如何使用SSE指令集对其进行优化。
2. 原理介绍
众所周知,在传统的图像边缘检测算法中,最常用的一种算法是利用Sobel算子完成的。Sobel算子一共有222个,一个是检测水平边缘的算子,另一个是检测垂直边缘的算子。
Sobel算子的优点是可以利用快速卷积函数,简单有效,且对领域像素位置的影响做了加权,可以降低边缘模糊程度,有较好效果。然而Sobel算子并没有基于图像的灰度信息进行处理,所以在提取图像边缘信息的时候可能不会让人视觉满意。
我们来看一下怎么构造Sobel算子?
Sobel算子是在一个坐标轴的方向进行非归一化的高斯平滑,在另外一个坐标轴方向做一个差分,kszie×ksizekszie\times ksizekszie×ksize大小的Sobel算子是由平滑算子和差分算子全卷积得到,其中ksizeksizeksize代表Sobel算子的半径,必须为奇数。
对于窗口大小为ksizeksizeksize的非归一化Sobel平滑算子等于ksize−1ksize-1ksize−1阶的二项式展开式的系数,而Sobel平滑算子等于ksize−2ksize-2ksize−2阶的二项式展开式的系数两侧补000,然后向前差分。
在这个例子中:我们要构造一个333阶的Sobel非归一化的Sobel平滑算子和Sobel差分算子:
Sobel平滑算子: 取二项式的阶数为n=2n=2n=2,然后计算展开式系数为,[C20,C21,C22][C_2^0, C_2^1, C_2^2][C20,C21,C22] 也即是[1,2,1][1, 2, 1][1,2,1],这就是333阶的非归一化的Sobel平滑算子。
Sobel差分算子:取二项式的阶数为n=3−2=1n=3-2=1n=3−2=1,然后计算二项展开式的系数,即为:[C10,C11][C_1^0, C_1^1][C10,C11],两侧补000 并且前向差分得到[1,0,−1][1, 0,-1][1,0,−1],第444项差分后可以直接删除。
Sobel算子:将333阶的Sobel平滑算子和Sobel差分算子进行全卷积,即可得到3×33\times 33×3的Sobel算子。
其中xxx方向的Sobel算子为:
soblex=[121]∗[10−1]=[10−120−210−1]soble_x=\begin{bmatrix} 1 \\2\\1 \end{bmatrix} * \begin{bmatrix} 1 & 0 &-1\end{bmatrix}=\begin{bmatrix} 1 &0&-1\\2&0&-2\\1&0&-1 \end{bmatrix}soblex=⎣⎡121⎦⎤∗[10−1]=⎣⎡121000−1−2−1⎦⎤
而yyy方向的Sobel算子为:
sobely=[10−1]∗[121]=[121000−1−2−1]sobel_y=\begin{bmatrix} 1 &0&-1 \end{bmatrix}*\begin{bmatrix} 1 \\2\\1 \end{bmatrix}=\begin{bmatrix} 1&2&1\\0&0&0\\-1&-2&-1 \end{bmatrix}sobely=[10−1</

最低0.47元/天 解锁文章
1077

被折叠的 条评论
为什么被折叠?



