OpenCV의 - 소벨 연산자 SCHARR 에지 검출 오퍼레이터

소벨 연산자의 기본 개념

소벨 연산자는 주로 이산 차동 에지 검출 오퍼레이터에 사용하고, 가우스 평활화 미분 유도 이미지 세기 함수를 근사 계산 구배 결합된다.

 

연산 처리 소벨 연산자 촉진제

(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

 

추천

출처www.cnblogs.com/bjxqmy/p/12325852.html