OpenCV: обнаружение градиента от черного к белому в области

Я загрузил пример изображения для лучшего понимания: http://www.imagebanana.com/view/kaja46ko/test.jpg

На изображении вы можете увидеть несколько строк развертки и маркер (белый прямоугольник с кружком внутри). Я хочу, чтобы OpenCV проходил по указанной области (в примере, выделенном линиями развертки), которая должна быть около 5x5. Если эта область содержит градиент от черного к белому, я хочу, чтобы OpenCV сохранил положение этой области, чтобы я мог работать с ней позже.

Конечным результатом будет различие между маркером и другими ретанглами, разделенными черными и белыми линиями.

Возможно ли что-то подобное? Я много гуглил, но нашел только детекторы краев, но это не то, что мне нужно, мне действительно нужно только определение градиента от черного к белому.

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


person Robin    schedule 04.08.2010    source источник


Ответы (3)


Было бы неплохо отфильтровать некоторые области, вычислив их гистограмму. Вы можете использовать cvCalcHist для этой задачи, затем вы можете установить некоторый порог, чтобы определить, соответствует ли процент черно-белых пикселей проценту градиента. Это не решит задачу, но поможет снизить сложность.

Затем вы можете стереть изображение, чтобы объединить все белые области. После применения порога можно будет найти связанные компоненты (используя cvFindContours), которые будут разделять изображения в черных или белых зонах. Затем вы можете обнаруживать градиенты, находя области 5x5, которые содержат как часть белой, так и черной зоны одновременно.

Надеюсь, поможет.

person dnul    schedule 04.08.2010

Спасибо, что ответил днул, но мне это не особо помогло. Я думал о гистограмме, чтобы подойти к проблеме, но это не совсем то, что мне нужно.

Я решил эту проблему, создав матрицу 40x40, которая содержит матрицу 5x5, содержащую необработанные данные пикселей во всех 3 каналах. Я повторил итерацию по каждой 40-пиксельной области и внутри итерации по каждой границе 5-ти пиксельной области. Я проверил каждый пиксель и сохранил те, которые темнее определенного порога, в хранилище.

После итерации у меня было приблизительное представление о том, сколько в них черных пикселей, поэтому я проверил каждый из них на наличие соседей с белыми пикселями во всех 3 каналах. Затем я пометил каждый из этих пикселей и сохранил их в другом хранилище.

Затем я использовал алгоритм ransac, чтобы построить линии из этих точек. Он строит около 5-20 строк на каждый край маркера. Затем я посмотрел на пересекающиеся линии и сохранил положение тех, которые пересекаются под прямым углом. 4 очка, которые я получаю, - это края маркера.

Если вы хотите воспроизвести это, вам придется заранее отфильтровать изображение и применить порог, чтобы было легче различать черные и белые пиксели.

Образец изображения, сохраните после нахождения точек и перед построением линий: http://www.imagebanana.com/view/i6gfe6qi/9.jpg

person Robin    schedule 06.08.2010

Вы описываете обнаружение края. Именно так, скажем, работает детектор кромок Canny. Он ищет темные пиксели рядом со светлыми пикселями и на основе порогового значения, которое вы проходите (есть также адаптивная ловушка, которая определяет порог за вас), и устанавливает их на все черные или все белые (также называемые `` маркирующими '' их ).

См. Здесь: http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html

person john ktejik    schedule 20.12.2012