OpenCV находит все значимые ребра вдоль линии

У меня есть изображение, которое я использовал для анализа в LabView с помощью метода Rake. По сути, этот метод находит все значимые края вдоль параллельных линий на изображении. http://zone.ni.com/reference/en-XX/help/370281P-01/imaqvision/imaq_rake_3/ (как видно на последнем изображении внизу ссылки). Прелесть этой функции в том, что она даст вам все краевые точки, которые больше определенной силы края, и каждое ребро будет генерировать только одну краевую точку (толщина линии края составляет 1 пиксель).

Я хочу использовать OpenCV, чтобы сделать что-то подобное. Я могу себе представить, как это сделать: деконструировать оператор Кэнни с фильтром по моему выбору, установить гистерезисное пороговое значение для граничных значений с двумя пороговыми значениями, за которым следует подавление немаксимумов, прочитать пиксели вдоль этой линии и пометить все пиксели, которые больше. чем мой порог

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

Спасибо


person Denis    schedule 21.03.2012    source источник


Ответы (1)


Не уверен, что я полностью понимаю этот вопрос, но о разделенной части не максимального подавления:

Один простой способ для 2D-немаксимального подавления заключается в следующем: расширьте изображение. Расширение в OpenCV устанавливает значение каждого пикселя в max() локальной окрестности. Повторите несколько раз или используйте большее ядро, чтобы получить желаемый радиус.

Затем сравните увеличенное изображение с оригиналом и установите все пиксели с разными значениями равными нулю.

Остальные пиксели являются локальными максимумами.

 # some code I once used in OpenCV/Python
 # given an image, sets all pixels to zero, unless they are local maxima
 def supressNonMaxima(img):
     localMax = cvCreateImage (cvGetSize(img), IPL_DEPTH_16U, 1)
     cvDilate(img, localMax, null, 3)  # max() with radius of 3

     mask = cvCreateImage( cvGetSize(img), 8, 1)
     cvCmp(img, localMax, mask, CV_CMP_LT)

     cvSet(img,0,mask)
person HugoRune    schedule 21.04.2012