Я хочу реализовать производную у изображения.
Дана следующая функция openCV, которая использует оператор Собела:
Sobel(gray_input_picture, y_derivative_picture, CV_32FC1 , 0, 1, 3, BORDER_DEFAULT);
Вот пример, как это выглядит:
Теперь мне нужно реализовать это самостоятельно, не используя эту функцию sobel.
Я нашел некоторую помощь здесь: Расчет направления градиента
То, что я теперь реализовал, было:
for(int x=0; x<gray_input_picture.rows; x++)
{
for(int y=0; y<gray_input_picture.cols; y++)
{
if(x == gray_input_picture.rows-1 || x == 0)
{
y_derivative.at<Vec3b>(x,y) = gray_input_picture.at<Vec3b>(x,y);
}
else
{
Vec3b color;
color[0] = gray_input_picture.at<Vec3b>(x+1,y)[0] - gray_input_picture.at<Vec3b>(x-1,y)[0];
color[1] = gray_input_picture.at<Vec3b>(x+1,y)[1] - gray_input_picture.at<Vec3b>(x-1,y)[1];
color[2] = gray_input_picture.at<Vec3b>(x+1,y)[2] - gray_input_picture.at<Vec3b>(x-1,y)[2];
y_derivative_picture.at<Vec3b>(x,y) = color;
}
}
}
bitwise_not ( y_derivative_picture, y_derivative_picture2 );
Переключатель x и y происходит от openCV. Вот почему это немного по-другому. Что я не понимаю, так это то, что я получаю изображение, которое мне нужно конвертировать (черный в белый, белый в черный).
Результат тоже немного другой. Содержит синие области:
Кто-нибудь знает, как я могу лучше реализовать производную y (что она похожа на функцию Собеля)?
Или кто-нибудь знает проблему в моей реализации?
Спасибо!
Я думаю, что вам, вероятно, нужно проверить, что оператор Sobel делает здесь: