создание оператора 3×3 sobel в opencv2 C

#opencv #computer-vision

#opencv #компьютерное зрение

Вопрос:

Я пытаюсь создать собственное обнаружение границ собеля на основе матриц gx и gy по трем каналам, которые у меня есть в моем коде ниже.
[[0,1,2], [-1,0,1], [-2,-1,0]] и

 [-2,-1,0],
 [-1,0,1],
 [0,1,2]]
  

Я отредактировал переменные j и i в своем коде дальше, но он не работает, как я могу создать обнаружение края собеля на этих трех каналах

 #include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

void salt(cv::Mat amp;image, int n) {

int i,j;
for (int k=0; k<n; k  ) {

    // rand() is the MFC random number generator
    i= rand()%image.cols;
    j= rand()%image.rows;


    if (image.channels() == 1) { // gray-level image

        image.at<uchar>(j,i)= 255; 

    } else if (image.channels() == 3) { // color image

        image.at<cv::Vec3b>(j,i)[0]= 255; 
        image.at<cv::Vec3b>(j-1,i-1)[1]= 255; 
        image.at<cv::Vec3b>(j,i-1)[2]= 255; 
    }
}
}

int main()
{
srand(cv::getTickCount()); // init random number generator

cv::Mat image= cv::imread("space.jpg",0);

salt(image,3000);

cv::namedWindow("Image");
cv::imshow("Image",image);

cv::imwrite("salted.bmp",image);

cv::waitKey(5000);

return 0;
}
  

Ответ №1:

Я немного смущен вопросом, потому что вопрос относится к фильтрам Собеля, но вы предоставили функцию, которая добавляет шум к изображению.

Для начала, вот функция Собеля, которая будет вызывать классические функции Собеля (которые будут вычислять градиенты dx и dy).

Во-вторых, существует более общий filter2D, который позволит вам применить произвольное ядро (например, то, которое вы создали в вопросе).

Наконец, если вы хотите применить разные ядра в каждом канале или полосе, вы можете поступить так, как указано в документации filter2D, и вызвать split для изображения, а затем вызвать filter2D для каждого канала, а затем объединить значения в изображение с одной полосой, используя матричные операторы.

Самая сложная вещь, которую, я думаю, вы могли бы спросить, — это как найти местоположение той соли, которую вы добавили в изображение, и ответом будет создание ядра для каждой группы следующим образом:

диапазон 0:

 [[ 0, 0, 0],
 [ 0, 1, 0],
 [ 0, 0, 0]]
  

полоса 1:

 [[ 1, 0, 0],
 [ 0, 0, 0],
 [ 0, 0, 0]]
  

полоса 2:

 [[ 0, 1, 0],
 [ 0, 0, 0],
 [ 0, 0, 0]]
  

Обязательно поместите якорь в центр ядра (1,1).