OpenCV distanceTransform возвращает неожиданные результаты (либо пустой мат, либо исходное изображение)

#opencv #distance #transformation

#opencv #расстояние #преобразование

Вопрос:

Я не могу успешно рассчитать преобразование расстояния с помощью OpenCV (2.3) на ubuntu. На выходе получается либо черный, либо копия исходного изображения, но никогда, как ожидалось, изображение в оттенках серого с градиентами.

Мой код:

 Mat input(Size(100,100), CV_8UC1);
circle(input, Point(50,50), 10 Scalar(255,255,255), 15, 0, 0));

Mat output(Size(100,100), CV_32FC1);
distanceTransformation(input, output, CV_DIST_L2, CV_DIST_MASK_3); //Output is completely black
//distanceTransformation(input, output, CV_DIST_L2, CV_DIST_MASK_PRECISE); //Output is a "copy" of input


imshow("in", input);
imshow("out", output);
 

Есть предложения?

Ответ №1:

Первый вызов правильный, но, будучи расстоянием, он не сохраняется как uchar . Когда вы хотите его отобразить, OpenCV преобразует эти значения с плавающей точкой (я думаю) в uchars. И результат кажется черным.

Найдите максимальное значение в выходных данных, а затем масштабируйте его, чтобы оно соответствовало изображению в оттенках серого

 double maxVal = findMaxDistanceSomehow(); 

output.convertTo( displayBuffer, CV_8UC1, 255./maxVal,0);

imshow("dist", displayBuffer);
 

Редактировать

Первая идея была правильной, но вы на самом деле не пытались найти maxVal! Вы сказали это, посмотрев на картинку, вместо того, чтобы фактически извлечь ее. Разница между победой и неудачей.

Итак, вычислите преобразование dist, используя точный алгоритм, а затем

 output.convertTo( displayBuffer, CV_8UC1, 10 ,0);
 

Редактировать 2

И вы должны поместить туда параметр (0).

Комментарии:

1. странно… ваше входное изображение черное с белым кругом? почему бы не установить его равным нулю перед закрашиванием круга? input.setTo(0);

2. Да, мое входное изображение черное с белым кругом (очень маленькая черная дыра в центре). setTo(0) ничего не меняет (к сожалению)…

3. Параметры, отличные от CV_DIST_MASK_PRECISE, возвращают только черные результаты. ТОЧНОЕ масштабирование работает! Спасибо!