Обработка изображений для распознавания 2D-объектов - PullRequest
3 голосов
/ 20 марта 2012

Я создал приложение для iPhone, которое может сканировать изображение страницы миллиметровки и затем сообщать мне, какие квадраты были затемнены, а какие пустыми.

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

Такого рода работает, но есть проблемы.Иногда я ошибочно принимаю линии графика на «черных».Иногда, если изображение искажено или у меня нет равномерного освещения по всей странице, я не получаю хороших результатов.

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

Учитывая, чтоэто мой первый проект по обработке изображений, я чувствую, что заново изобретаю колесо.Я хотел бы получить предложения о том, как это сделать и использовать ли библиотеки, такие как OpenCV.

Я прилагаю изображение, похожее на то, что я хотел бы обработать.Я ищу список всех квадратов, которые имеют значительное количество черной маркировки, то есть A8, C4, E7, G4, H1, J9.enter image description here

Проблемы, о которых следует знать:

  • Световой охват изображения может быть не идеальным, но должен быть относительно равномерным по всему изображению (то есть без теней)
  • Все квадраты могут быть пустыми или полностью темными, и алгоритм должен быть в состоянии определить, что
  • изображение может быть перекошено или повернуто вокруг любой оси.Вращение вокруг оси z может быть легко исправлено.Может быть вращение вокруг оси x или y, что делает одну сторону изображения шире, чем другую.Однако, если я сканирую изображение в режиме реального времени, как оно поступает с камеры, я могу попросить пользователя выровнять метки совмещения с метками на экране.Как лучше всего обеспечить такое выравнивание, чтобы дать пользователю соответствующую обратную связь?Просто проверка, чтобы убедиться, что 4 угла темные, может привести к ложному положительному результату, когда камера указывает на черную поверхность.
  • не каждый квадрат будет одинаково или постоянно затемнен, но я думаю, что будет достаточночерный, чтобы сделать его бесспорным для человеческого глаза.
  • синяя сетка может быть полезной, но есть случаи, когда черные маркировки могут перекрывать синюю сетку.Я думаю, что виртуальная сетка, вероятно, лучше, чем полагаться на печатную сетку.Я думаю, что использование маркеров выравнивания для выравнивания изображения позволит создать точную виртуальную сетку.И затем содержимое каждой ячейки сетки может быть отобрано, чтобы увидеть, было ли оно преимущественно черным, по сравнению со сканированием слева направо, нет?Вот еще одно изображение с большим количеством отметок на сетке.На этом изображении, в дополнение к предыдущей маркировке в A8, C4, E7, G4, H1, J9, я пометил E2, G8 и G9 и I4 и J4, и вы можете увидеть, как синяя сетка скрыта.

2nd image

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

Ответы [ 2 ]

5 голосов
/ 22 марта 2012

Начнем с того, что эта проблема немного напомнила мне эти демонстрационные примеры, из которых можно было бы поучиться:

Лично я считаю самый простой подходбудет обнаруживать квадраты на вашем изображении.

1) Удалите фон и мелкую крошку

f_makebw = @(I) im2bw(I.data, double(median(I.data(:)))/1.3);
bw = ~blockproc(im, [128 128], f_makebw);
bw = bwareaopen(bw, 30);

enter image description here

2) Удалите все, кроме квадратов и кругов.

se = strel('disk', 5);
bw = imerode(bw, se);

% Detect the squares and cricles via morphology
[B, L] = bwboundaries(bw, 'noholes');

3) Определите квадраты, используя «удлинение» от regionprops.Метрика «Степень» измеряет, какая доля ограничивающего прямоугольника заполнена.Это делает отличной мерой различие между кругами и квадратами

stats = regionprops(L, 'Extent'); 
extent = [stats.Extent];
idx1 = find(extent > 0.8);
bw = ismember(L, idx1);

enter image description here

4) Это оставляет вас с вашими функциями, с которыми можно синхронизировать или исправить изображение.Простой и надежный способ сделать это с помощью функции автокорреляции.

enter image description here

Это дает хорошие пики, которые легко обнаруживаются.Эти пики могут быть сопоставлены с пиками ACF из изображения шаблона с помощью венгерского алгоритма.После сопоставления вы можете исправить вращение и масштабирование, так как теперь у вас есть линейная система, которую вы можете решить:

x = Ax'

Перевод может быть исправлен с помощью обычного крестакорреляция с тем же предварительно определенным шаблоном.

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

3 голосов
/ 27 марта 2012

Я начал делать что-то похожее, используя мою GPUImage платформу iOS, так что это может быть альтернативой для всего этого в OpenCV или чем-то еще.Как видно из названия, GPUImage полностью основан на GPU, поэтому он может иметь некоторые огромные преимущества в производительности по сравнению с обработкой с привязкой к процессору (до 180 раз быстрее при выполнении таких задач, как обработка живого видео).

В качестве первого этапа,Я взял ваши изображения и провел их через простой фильтр пороговой яркости с порогом 0,5 и пришел к следующим двум вашим изображениям:

Threshold image 1 Threshold image 2

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

Adaptive threshold image 1 Adaptive threshold image 2

и, кажется, выделяет линии сетки, что звучит какВы хотите игнорировать.

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

Эти операции порогового значения на основе графического процессора выполняются менее чем за 2 мс для 640x480 кадров на iPhone 4, поэтому может быть возможно объединить в цепочку фильтры для анализа входящих видеокадров так быстро, каквидеокамера устройства может обеспечить их.

...