소벨 연산자의 기본 개념
소벨 연산자는 주로 이산 차동 에지 검출 오퍼레이터에 사용하고, 가우스 평활화 미분 유도 이미지 세기 함수를 근사 계산 구배 결합된다.
연산 처리 소벨 연산자 촉진제
(1) 각각, 두 방향으로 x 및 y 유도체
유도 X 방향 : 소스 화상 및 G X 복잡한
Y 방향 도출 : 원본 이미지와 G의 Y 선상
(2) 각 점에 대해, 둘 개 이상의 이미지를 결합의 결과는 약 구배 수득
에 단순화 할 수있다 :
소벨 기능
보이드 소벨 (InputArray SRC, DST OutputArray, 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 방향 시크의 1 차 도함수, DX = 1, DY = 0.
- 순서 번호 (DY), Y 방향 가이드 0 만이다. 만일 방향 및 Y, DX = 0의 1 차 도함수, 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