sobel边缘检测java_Sobel边缘检测

sobel边缘检测java_Sobel边缘检测_第1张图片

Sobel算子:[-1  0  1

-2  0  2

-1  0  1]

用此算子与原图像做卷积,可以检测出垂直方向的边缘。算子作用在图像的第二列,结果是:200,200,200;作用在第三列,结果是:

200,200,200;

边缘 – 是像素值发生跃迁的地方(变化率最大处,导数最大处),是图像的显著特征之一,在图像特征提取、对象检测、模式识别等方面都有重要的作用。

Sobel算子和Scharr算子

(1)Sobel算子:是离散微分算子(discrete differentiation operator),用来计算图像灰度的近似梯度,梯度越大越有可能是边缘。

Soble算子的功能集合了高斯平滑和微分求导,又被称为一阶微分算子,求导算子,在水平和垂直两个方向上求导,得到的是图像在X方法与Y方向梯度图像。

缺点:比较敏感,容易受影响,要通过高斯模糊(平滑)来降噪。

算子是通过权重不同来扩大差异。

梯度计算:(在两个方向求导,假设被作用图像为 I)

水平变化: 将 I 与一个奇数大小的内核 Gx进行卷积。比如,当内核大小为3时, Gx的计算结果为:

b7197ccc6bb8ff7c24cdb13675281bdf.png

垂直变化: 将 I 与一个奇数大小的内核 Gy进行卷积。比如,当内核大小为3时, Gy的计算结果为:

d453af297cd8d0353786f6abca0d6a9d.png

在图像的每一点,结合以上两个结果求出近似梯度:

a6a1d80fa064c622cf5bcf927c0896d6.png

有时也用下面更简单公式代替,计算速度快:(最终图像梯度)。

d700fc2b0dafce1e022a88e10b42e9cc.png

(2)Scharr:当内核大小为3时, 以上Sobel内核可能产生比较明显的误差(毕竟,Sobel算子只是求取了导数的近似值)。 为解决这一问题,OpenCV提供了 Scharr 函数,但该函数仅作用于大小为3的内核。该函数的运算与Sobel函数一样快,但结果却更加精确,不怕干扰,其内核为:

sobel边缘检测java_Sobel边缘检测_第2张图片

(3)Sobel/Scharr提取边缘(求导)步骤:

1)高斯模糊平滑降噪:

GaussianBlur( src, dst, Size(3,3), 0, 0, BORDER_DEFAULT );

2)转灰度:

cvtColor( src, gray, COLOR_RGB2GRAY );

3)求X和Y方向的梯度(求导):

Sobel(gray_src, xgrad, CV_16S, 1, 0, 3);

Sobel(gray_src, ygrad, CV_16S, 0, 1, 3);

Scharr(gray_src, xgrad, CV_16S, 1, 0);

Scharr(gray_src, ygrad, CV_16S, 0, 1);

4)像素取绝对值:

convertScaleAbs(A, B); //计算图像A的像素绝对值,输出到图像B

23d1d11f6cd5973c60de1353192c5d99.png

5)相加X和Y,得到综合梯度,称为振幅图像:

addWeighted( A, 0.5,B, 0.5, 0, AB); //混合权重相加,效果较差

或者循环获取像素,每个点直接相加,效果更好。

来源:https://zhuanlan.zhihu.com/p/40491339

标签:Sobel,检测,图像,边缘,内核,算子,梯度,Scharr

来源: https://www.cnblogs.com/yibeimingyue/p/10878514.html

你可能感兴趣的:(sobel边缘检测java)