создание 3x3 оператора sobel в opencv2 C ++ - PullRequest
0 голосов
/ 13 октября 2011

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

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

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

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

void salt(cv::Mat &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 Ответ

0 голосов
/ 17 ноября 2011

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

Для начала, вот функция Sobel , которая будет вызывать классические функции sobel (которые будут вычислять градиенты 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...