OpenCV: обнаружение градиента от черного к белому в области - PullRequest
1 голос
/ 04 августа 2010

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

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

Окончательный результат заключается в различении маркера и других.ретрансляторы разделены через черные и белые линии.

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

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

Ответы [ 3 ]

2 голосов
/ 04 августа 2010

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

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

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

1 голос
/ 06 августа 2010

Спасибо за ваш ответ dnul, но это действительно не помогло мне решить это. Я думаю о гистограмме для решения проблемы, но это не совсем то, что я хочу.

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

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

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

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

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

0 голосов
/ 20 декабря 2012

Что вы описываете - это обнаружение края.Именно так, скажем, работает детектор краев Canny.Он ищет темные пиксели рядом со светлыми пикселями и основывается на заданном вами пороговом значении (есть также адаптивный canny, который вычисляет пороговое значение для вас), и устанавливает для них все черное или все белое (иначе «помечает» их).

Смотрите здесь: http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html

...