#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).