ソーベル演算子の基本的な考え方
ソーベル演算子は、主に離散微分エッジ検出演算子で使用され、それが画像強度関数を近似するガウス平滑化微分導出、勾配計算を組み合わせています。
計算プロセスソーベルオペレータプロモーター
(1)、それぞれ、二方向XとYの誘導体
導出X方向:ソース画像とG X入り組ん
y方向の導出:ソース画像及びG Y入り組ん
(2)各点について、二つ以上の画像を結合した結果は、約勾配を得
に単純化することができます。
ソーベル機能
ボイドソーベル(InputArray SRC、OutputArray DST、INT ddepth、INT DX、DY INT、INT ksize = 3、ダブルスケール= 1、ダブルデルタ= 0、INT borderType = BORDER_DEFAULT)。
- SRC、入力画像は、マットタイプを埋めるために。
- DST、出力画像と元画像と同じサイズとタイプを有する必要があります。
- ddepth、出力画像の深さは、次の要件を満たしています。
src.depth()= CV_8U、ddepth = -1 / CV_16S / CV_32F / CV_64F
src.depth()= CV_16U / CV_16S、ddepth = -1 / CV_32F / CV_64F
src.depth()= CV_32F、ddepth = -1 / CV_32F / CV_64F
src.depth()= CV_64F、ddepth = -1 / CV_64F
- DXで注文誘導体は、x方向は0のみです。場合x方向シークに一次導関数、DX = 1、DY = 0。
- 順序番号DY、Y方向ガイドは、0のみです。方向及びyの一次導関数であれば、DX = 0、DY = 1。
- ksizeは、デフォルト値は3であり、核のソーベル大きさを表し、1,3,5,7-をフェッチしなければなりません。
- scale,计算导数值的缩放因子,默认值为 1,表示默认情况下不进行缩放。
- delta,输出梯度 = scale * G + delta。
- borderType,Gx 和 Gy 都有一定大小,边缘会处理不到,需要进行边缘扩展。这个参数指定边缘扩充类型。
一般情况下,都是使用 ksize×ksize 内核来计算导数的,然而,当 ksize = 1 时,会使用 3×1、1×3 的内核。这种情况下,并没有进行高斯平滑操作。
代码示例:
#include<opencv.hpp>
using namespace cv;
int main() {
Mat src = imread("C:/Users/齐明洋/Desktop/证件照/7.jpg");
GaussianBlur(src, src, Size(3, 3), 0, 0);
imshow("src", src);
Mat gray, x_img, y_img, sobel_img;
cvtColor(src, gray, COLOR_BGR2GRAY);
Sobel(gray, x_img, -1, 1, 0, 3);
imshow("x_img", x_img);
Sobel(gray, y_img, -1, 0, 1, 3);
imshow("y_img", y_img);
addWeighted(x_img, 1, y_img, 1, 0, sobel_img);
//https://www.cnblogs.com/bjxqmy/p/11986135.html
imshow("sobel_img", sobel_img);
waitKey(0);
}
效果演示:
补充说明:当内核大小为 3×3 时,sobel 内核可能产生比较明显的误差,毕竟 sobel 算子只是求取了导数的近似值而已。为解决这一问题,OpenCV 提供了 Scharr 函数,但该函数仅作用于 3×3 的内核。该函数的运算与 Sobel 函数一样快,但结果更精确,其内核为
借鉴博客:https://www.cnblogs.com/wxl845235800/p/7700887.html
https://www.cnblogs.com/sevenyuan/p/7874344.html