OpenCV 边缘检测Sobel

一、Sobel算子理论解析

Sobel算子用来计算一阶、二阶、三阶或混合图像差分。

一阶图像差分根据一阶导数来近似,\frac{\partial f}{\partial x} = f'(x) = f(x+1)-f(x)\frac{\partial f}{\partial y} = f'(y) = f(y+1)-f(y)

一阶计算过程:

1. 分别在x和y方向求导:

x方向:将I与一个奇数大小的内核Gx进行卷积,当内核为3时,Gx的计算结果为:

G_x = \begin{bmatrix} -1 & 0 & 1\\ -2& 0 & 2\\ -1& 0 & 1 \end{bmatrix}*I

y方向:将I与一个奇数大小的Gy进行卷积,当内核为3时,Gy的计算结果为:

G_y = \begin{bmatrix} -1 & -2 & -1\\ 0& 0 & 0\\ 1& 2 & 1 \end{bmatrix}*I

注:Sobel中间加入权重值2,可以有效抑制(平滑)噪声。

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

G = \sqrt{G_x^2 + G_y^2}

二阶图像差分根据二阶导数来近似,

\frac{\partial^2 f}{\partial x^2} = f'(x+1)-f'(x) = f(x+1)+f(x-1)+2*f(x)

\frac{\partial^2 f}{\partial y^2} = f'(y+1)-f'(y) = f(y+1)+f(y-1)+2*f(y)

二阶计算过程:

1. 分别在x和y方向求导:

x方向:将I与一个奇数大小的内核Gx进行卷积,当内核为3时,Gx的计算结果为:

G_x = \begin{bmatrix} 1 & -2 & 1\\ 2& -4 & 2\\ 1& -2 & 1 \end{bmatrix}*I

y方向:将I与一个奇数大小的Gy进行卷积,当内核为3时,Gy的计算结果为:

G_y = \begin{bmatrix} 1 & 2 & 1\\ -2& -4 &-2\\ 1& 2 & 1 \end{bmatrix}*I

注:Sobel中间加入权重值2,可以有效抑制(平滑)噪声。

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

G = \sqrt{G_x^2 + G_y^2}

注:为防止溢出,所有计算结果均需要在[0,255]中。

二、Sobel算子代码验证

#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

int main()
{
	Mat src = Mat(5,5,CV_8UC1);
	randu(src, Scalar::all(0), Scalar::all(255));
	Size size = src.size();
	cout << "原图像" << endl;
	cout << src << ";" << endl << endl;

	Mat dst;
	copyMakeBorder(src, dst, 1, 1, 1, 1, BORDER_DEFAULT);
	cout << "BORDER_DEFAULT填充后的图像" << endl;
	cout << dst << ";" << endl << endl;


	Mat gradient_x;
	Sobel(src, gradient_x, src.depth(), 1, 0);
	cout << "SobelX方向的一阶差分" << endl;
	cout << gradient_x << ";" << endl << endl;

	Mat gradient_2;
	Sobel(src, gradient_2, src.depth(), 2, 0);
	cout << "SobelX方向的二阶差分" << endl;
	cout << gradient_2 << ";" << endl << endl;
}

三、Scharr滤波器

在Sobel算法中,内核大小为3时,可能产生比较明显的误差。为了解决这一问题,opencv提供了scharr函数,仅作用于内核为3的特殊情况,内核为:

G_x = \begin{bmatrix} -3 & 0 & 3\\ -10& 0 & 10\\ -3& 0 & 3 \end{bmatrix}      G_y = \begin{bmatrix} -3 & -10 & -3\\ 0& 0 & 0\\ 3& 10 & 3 \end{bmatrix}

故下面两者是等价的

Scharr(src, dst,ddepth, dx, dy, scale, delta, bodertype)
Sobel( src, dst,ddepth, dx, dy, CV_SCHARR, scale, delta, bodertype)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪易

给我来点鼓励吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值