Определить границы прямоугольника символа или объекта в черно-белом или двоичном изображении - PullRequest
0 голосов
/ 07 августа 2011

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

Теперь я путаю сложную проблему, подобную этой: как извлечь один символ из черно-белого (двоичного) изображения или как нарисовать связанный прямоугольник символа в черно-белом (двоичном) изображении?

Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 07 августа 2011

Если вы используете MATLAB (что, я надеюсь, так и есть, поскольку оно отлично подходит для подобных задач), я предлагаю вам взглянуть на встроенную функцию bwlabel () и regionprops (). Их должно быть достаточно, чтобы сегментировать все символы и получить информацию об их ограничительной рамке.

Ниже приведен пример кода:

%Read image
Im = imread('im1.jpg');

%Make binary
Im(Im < 128) = 1;
Im(Im >= 128) = 0;

%Segment out all connected regions
ImL = bwlabel(Im); 

%Get labels for all distinct regions
labels = unique(ImL);

%Remove label 0, corresponding to background
labels(labels==0) = [];

%Get bounding box for each segmentation
Character = struct('BoundingBox',zeros(1,4));
nrValidDetections = 0;
for i=1:length(labels)
    D = regionprops(ImL==labels(i));
    if D.Area > 10
        nrValidDetections = nrValidDetections + 1;
        Character(nrValidDetections).BoundingBox = D.BoundingBox;
    end
end


%Visualize results
figure(1);
imagesc(ImL);
xlim([0 200]);
for i=1:nrValidDetections
    rectangle('Position',[Character(i).BoundingBox(1) ...
                          Character(i).BoundingBox(2) ...
                          Character(i).BoundingBox(3) ...
                          Character(i).BoundingBox(4)]);

end

Изображение, которое я прочитал здесь, от 0 до 255, поэтому я должен пороговое значение, чтобы сделать его двоичным. Так как точки выше i и j могут быть проблемой, я также порождаю количество пикселей, которые составляют отдельную область.

Результат можно увидеть здесь: https://www.sugarsync.com/pf/D775999_6750989_128710

1 голос
/ 08 августа 2011

Лучшим способом извлечения символа в моем случае была сегментация гистограммы, которой я могу поделиться только с некоторыми бумагами.

http://cut.by/j7LE8

http://cut.by/PWJf1

может быть, это может помочь вам

0 голосов
/ 07 августа 2011

Один из простых вариантов - использовать исчерпывающий поиск, например (при условии, что текст черный, а фон белый):

  1. Начиная с самого левого столбца, проходите все строки, проверяя наличие черного пикселя.
  2. Когда вы встретите свой первый черный пиксель, сохраните текущий индекс столбца как left.
  3. Продолжайте обходить столбцы, пока не встретите столбец без черных пикселей, сохраните индекс столбца как right.
  4. Теперь проходите строки аналогичным образом, начиная с самого верхнего ряда и проходя через каждый столбец в этом ряду.
  5. Когда вы встретите свой первый черный пиксель, сохраните текущий индекс строки как top.
  6. Продолжайте перемещаться по строкам, пока не найдете один без черных пикселей, и сохраните эту строку как `bottom.

Ваш персонаж будет содержаться в рамке, определяемой (left - 1, top - 1) как верхний левый угол и (right, bottom) как нижний правый угол.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...