2014-10-17 7 views
4

Я хочу использовать функцию distanceTransform(), чтобы найти минимальное расстояние от ненулевых пикселей до нулей пикселей, а также положение этого ближайшего нулевого пикселя. Я вызываю вторую версию функции с флагом labelType, установленным на DIST_LABEL_PIXEL. Все работает отлично, и я получаю расстояния и индексы ближайших нулевых пикселей.Пиксельная индексация в преобразовании расстояния OpenCV

Теперь я хочу преобразовать индексы обратно в пиксельные местоположения, и я думал, что индексирование будет как idx = (строка * cols + col) или что-то вроде этого, но мне нужно было выяснить, что OpenCV просто подсчитывает нулевые пиксели и используя этот счет как индекс. Поэтому, если я получаю 123 в качестве индекса ближайшего пикселя, это означает, что 123-й нулевой пиксель является самым близким.

  1. Как выглядит OpenCV? Возможно, по-разному?

  2. Есть ли эффективный способ отображения индексов обратно в местоположения? Очевидно, я мог бы пересчитать их и следить за подсчетами и позициями, если я знаю, как их оценивает OpenCV, но это кажется глупым и не очень эффективным.

  3. Есть ли веская причина использовать индексирование, которое они использовали? Я имею в виду, есть ли преимущества перед использованием абсолютной индексации?

Заранее спасибо.

EDIT:

Если вы хотите увидеть, что я имею в виду, вы можете запустить:

Mat mask = Mat::ones(100, 100, CV_8U); 
mask.at<uchar>(50, 50) = 0; 

Mat dist, labels; 
distanceTransform(mask, dist, labels, CV_DIST_L2, CV_DIST_MASK_PRECISE, DIST_LABEL_PIXEL); 

cout << labels.at<int>(0,0) << endl; 

Вы увидите, что все метки 1, потому что есть только один ноль пикселей, но как Должен ли я найти местоположение (50,50) с этой информацией?

ответ

4

Нулевые пиксели также маркируются - они будут иметь ту же метку, что и ненулевые пиксели, к которым они ближе всего.

Итак, у вас будет 2D-массив меток, такого же размера, как и исходное изображение. Если вы просмотрите все нулевые пиксели исходного изображения, вы можете найти соответствующую метку из возвращаемого 2D-массива. Затем это позволит вам определить, какие ненулевые пиксели связаны с каждым нулевым пикселем, сопоставляя метки.

Если вы понимаете, что я имею в виду.

+0

Да, я вижу, и это имеет смысл, потому что эти пиксели ближе всего к себе. Но для этого потребуется дополнительный проход по изображению, чтобы собрать метки и местоположения нулевых пикселей. Я просто не вижу преимущества этого по абсолютной индексации. Во всяком случае, спасибо, я не думал об этом и, по крайней мере, мне не нужно их считать. – thomas

+0

@thomas Спасибо - и вам не нужен дополнительный проход по изображению, вы можете построить карту пикселей на метки за один проход. Просто нужно немного подумать в алгоритме. –

+1

Я не говорил об этом раньше, но хочу присвоить значения ненулевым пикселям на основе значений и расстояний ближайших нулевых пикселей (очевидно, не в маске, которую я использовал для преобразования расстояния). Я, хотя это можно сделать за один проход, «получить ярлык», «вычислить местоположение», «захватить» значение, выполнить некоторую математику, присвоить значение ». Теперь мне нужно заранее выполнить сопоставление сопоставления метки-> местоположения, что делает его вторым проходом в дополнение к пропуску присваивания, который я должен делать в любом случае. – thomas

 Смежные вопросы

  • Нет связанных вопросов^_^