2016-01-10 2 views
0

Я читал документацию по поиску углов в изображении с помощью детектора Harris Corner. Я не мог понять, почему они нормализуют изображение после применения функции Harris Corner. Я немного смущен идеей нормализации. Может кто-нибудь объяснить мне, почему мы нормализуем изображение? Кроме того, что делает converttscaleabs(). Я все еще стартер в opencv и поэтому его трудно понять из документации.Нормализация в Угловом детекторе Харриса в Opencv C++?

cornerHarris(src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT); 

    /// Normalizing 
    normalize(dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat()); //(I couldnot understand this line) 
    convertScaleAbs(dst_norm, dst_norm_scaled); // ??? 

Благодаря

+1

Wow waqas keep it uo –

ответ

2

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

Таким образом, Википедия определяет это следующим образом: «Нормализация - это процесс, который изменяет диапазон значений интенсивности пикселей ... Нормализация иногда называется растяжением растяжения или растяжением гистограммы».

Чтобы проиллюстрировать это определение я попытаюсь дать вам простой пример:

Imagine у ​​вас есть 8 битное серая шкала изображения, возможные значения интенсивности пикселей перейти от 0 до 255. Если изображение имеет «низкий контраст» , ее гистограмма покажет концентрацию пикселей вокруг определенного значения, как вы можете видеть на следующей картинке:

Histogram

Теперь, что нормализация делает «взять» эту гистограмму и растяжку его. Он применяет карту преобразования интенсивности, которая коррелирует исходные минимальные и максимальные значения интенсивности с новой парой минимальных и максимальных значений в пределах полного диапазона интенсивностей (от 0 до 255).

Что касается convertScaleAbs(), то в документации указано, что это scales, calculates absolute values, and converts the result to 8-bit. Не о чем больше говорить.

Полный прототип void convertScaleAbs(InputArray src, OutputArray dst, double alpha=1, double beta=0), так что он просто вычисляет абсолютное значение каждого элемента в матрице и преобразует его в действительное 8-разрядное значение без знака.

+0

: - Большое спасибо. Замечательное объяснение. – Raj

+1

@Raj «Один счастлив быть полезным». Ура! – Nacho

2

Возможно, вы просматриваете код OpenCV tutorials.

Нормализуя угловой ответ (что в каком-то неизвестном интервале) в интервале [0, 255] с

normalize(dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat()); 

легче выбрать порог (так как теперь вы знаете, что порог будет также в интервале [0, 255]), чтобы сохранить только самые сильные ответы. Диапазон [0,255] полезен, когда в таком случае вы получаете пороговое значение с помощью ползунка, который может иметь только целочисленные значения.

convertScaleAbs(dst_norm, dst_norm_scaled); 

нужен только для преобразования dst_norm в Mat типа CV_8U, поэтому он может быть показан правильно imshow.

+1

: - Большое спасибо. – Raj

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