Как извлечь контур, используя код цепи Freeman с помощью Matlab?

Я работаю в своем проекте по проблеме распознавания писателей по рукописным арабским документам.

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

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

Следующая ссылка содержит код Freeman в Matlab, но я не знаю, как его использовать.

Я приветствую ваше предложение и заранее благодарю

2 ответа

Вы можете использовать imcontour функция.

Например, если вы загрузите этот образец изображения

Образец изображения

Img = imread('test.png');

Вы можете получить контур с помощью команды:

C = imcontour(Img, 1);

Контур результата

Затем вы можете использовать функцию freeman, которую вы цитируете, с C в качестве первого ввода.

Другим примером может быть использование bwperim, По сути, это позволяет взглянуть на все отдельные двоичные объекты на изображении и выделить периметр каждого объекта. Это работает только для объектов белого цвета, поэтому, используя пример @Crazy rat, мы можем сделать следующее:

im = ~im2bw(imread('https://stackru.com/images/58eefec2d3e3e63ad2a41fa07ef0148cc9a5298e.png'));
out = ~bwperim(im);

Выше будет читать на изображении и преобразовать его в двоичную / logical, Затем нам нужно инвертировать изображение, чтобы объект / текст был белым, а фон - черным. После звоните bwperim так что вы извлекаете периметр объектов, а затем конвертируете обратно, чтобы текст объекта был черным, мы реинвертируем.

Я получаю вывод:

Несомненное преимущество bwperim над imcontour в том, что bwperim обеспечивает фактическое выходное изображение, тогда как imcontour только рисует фигуру для вас. Вы, конечно, можете извлечь данные изображения из рисунка, например, используя h = gcf; out = h.cdata; идиома, но это будет включать в себя часть фигуры фона в результате. Я подозреваю, что вместо этого вам понадобится настоящее сырое изображение, и поэтому я бы порекомендовал использовать bwperim,

Как мы используем это с кодом Freeman, который вы связали?

Если вы посмотрите на исходный код, он принимает два входа:

  1. b, который является N x 2 матрица координат, определяющая границу фигуры, которую вы хотите закодировать
  2. unwrap - необязательный параметр

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

[y,x] = find(out == 0);
cc = chaincode([y x]);
Другие вопросы по тегам