#include <opencv2/imgproc.hpp>
void cv::Sobel(InputArray src,
OutputArray dst,
int ddepth,
int dx,
int dy,
int ksize = 3,
double scale = 1,
double delta = 0,
int borderType = BORDER_DEFAULT
使用扩展Sobel算子计算第一,第二,第三或混合图像的导数.
在某一种情况外的所有情况中国,都使用ksize x ksize的可分离Kernel去计算导数.
当ksize =1时,使用3x1或1x3的Kernel(即不做高斯平滑).
ksize=1只能用于计算第一个或第二个x或y的导数.
哈有一个特殊值,ksize = CV_SCHARR(-1),它对应于3x3的Scharr过滤器.它能给出比3x3的Sobel更准确的结果.Scharr是:
∣ 3 0 3 10 0 10 − 3 0 3 ∣ \left|\begin{matrix} 3 & 0 & 3 \\ 10 & 0 & 10 \\ -3 & 0 & 3 \end{matrix} \right| ∣∣∣∣∣∣310−30003103∣∣∣∣∣∣
求x阶导数或y阶导数的转置.
下面的函数通过将图像与适当的Kernel进行卷积计算图像的导数:
d s t = δ x o r d e r + y o r d e r s r c δ x x o r d e δ y y o r d e dst=\frac{\delta^{xorder+yorder}src}{\delta_x^{xorde}\delta_y^{yorde}} dst=δxxordeδyyordeδxorder+yordersrc
Sobel算子结合了高斯平滑和微分,对噪声有一定的抵抗能力.最常见的使用是(xorder=1,yorder=0,ksize=3)或者(xorder=0,yorder=1,ksize=3)调用函数来计算x或y图像的第一个导数.
第1种情况对应的Kernel是:
∣ − 1 0 1 − 2 0 2 − 1 0 1 ∣ \left|\begin{matrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{matrix} \right| ∣∣∣
∣∣∣−1−2−1000121∣∣∣∣∣∣
第2种情况对应的Kernel是:
∣ − 1 − 2 − 1 0 0 0 1 2 1 ∣ \left|\begin{matrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{matrix} \right| ∣∣∣∣∣∣−101−202−101∣∣∣∣∣∣
src:输入图片
dst:与输入图片具有相同大小以及通道数的输出图像
ddepth:输出图像深度,
dx:x方向导数
dy:y方向导数
ksize:扩展Sobel算子Kernel的大小,必须是1,3,5,7
scale:可选用于计算导数的比例因子;默认情况下,不用扩展
delta:可选默认增量值,在将结果存储到dst之前添加到结果中的增量值.
borderType:像素向外扩展方法.参考BorderTypes.不支持BORDER_WRAP.