Как извлечь контур, используя код цепи 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, который вы связали?
Если вы посмотрите на исходный код, он принимает два входа:
b
, который являетсяN x 2
матрица координат, определяющая границу фигуры, которую вы хотите закодироватьunwrap
- необязательный параметр
Если вы хотите использовать функцию, с которой вы связали нас, просто извлеките координаты строки и столбца тех пикселей, которые находятся вдоль границы вашего изображения. Таким образом, это еще одно ограничение imcontour
, так как вы не сможете определить эти места без самого исходного контурного изображения. Поэтому все, что вам действительно нужно сделать, это:
[y,x] = find(out == 0);
cc = chaincode([y x]);