Если я применить Собел фильтр к изображению в Python с использованием scipy.ndimage.filters.convole
я получаю значимые результаты, например, для этого простого входного изображения img
Применение ядра с OpenCV в C++
0 255 0
0 255 0
0 255 0
свертка
dimage.filters.convolve(img, Kx)
с Kx
-1 0 1
-2 0 2
-1 0 1
возвращает MEA ningful градиент в направлении х:
-1020 0 1020
-1020 0 1020
-1020 0 1020
Я не знаю, как получить эквивалентный результат с помощью openCV2 в C++, хотя. Когда я определить входное изображение
int image_data[9] = {0, 255, 0, 0, 255, 0, 0, 255, 0};
cv::Mat image = cv::Mat(3, 3, CV_32F, image_data);
и применить ядро на
cv::Mat gradientx;
double sobelx_data[9] = {-1, 0, 1, -2, 0, 2, -1, 0, 1};
cv::Mat sobelx = cv::Mat(3, 3, CV_32F, sobelx_data);
cv::filter2D(image, gradientx, -1, sobelx);
я получаю следующий результат
for(int row=0; row<gradientx.rows; row++) {
for(int col=0; col<gradientx.cols; col++) {
std::cout << gradientx.at<int>(row,col) << std::endl;
}
}
возвращает следующее изображение
478 -2147482660 478
478 -2147482660 478
478 -2147482660 478
Кажется, что есть n проблема переполнения, но я не знаю почему. Попытка получить значения из gradientx.at<double>(row,col)
производит
-1.68911e-311 8.10602e-312 8.11663e-312
-1.68911e-311 8.10602e-312 8.11663e-312
-1.68911e-311 2.122e-314 8.54412e-72
Может кто-нибудь сказать мне, почему это? Разве не filter2D
должен сделать 2D-свертку на изображении, и почему я получаю странные значения при обращении к выходным пикселям с <double>
? Спасибо.
'CV_32F' является' float'. – beaker
@beaker Спасибо, я поменял его на float .. Положите, теперь он печатает мне нулевую матрицу ... – TheWaveLad
Теперь похоже, что у вас проблемы с типом границы. Я отправлю ответ за секунду. – beaker