如何使用matlab使用freeman链码提取轮廓?

时间:2015-02-06 13:48:59

标签: matlab image-processing pattern-recognition

我在手写阿拉伯文档中的作家识别问题项目中工作。

识别作者,我使用了数据库图像,  我的问题是如何从这些图像中提取特征。我是matlab的新手,我对图像处理知之甚少。

请帮助我,我需要从图像中提取轮廓,然后使用freeman链码对其进行编码。

The following link contains freeman code in matlab but I do not know how to use it.

我欢迎您的建议,并提前感谢您

2 个答案:

答案 0 :(得分:2)

您可以使用imcontour功能。

例如,如果您加载此示例图像

Sample image

Img = imread('test.png');

您可以使用以下命令获取轮廓:

C = imcontour(Img, 1);

Result contour

然后你可以使用你引用的freeman函数作为第一个输入。

答案 1 :(得分:1)

另一个例子可能是使用bwperim。这基本上是查看图像中的所有不同二进制对象并提取每个对象的周长。这仅适用于白色的对象,因此使用@Crazy rat的示例,我们可以这样做:

im = ~im2bw(imread('http://i.stack.imgur.com/p9BZl.png'));
out = ~bwperim(im);

上面将读入图像并将其转换为二进制/ logical。接下来,我们需要反转图像,以便在背景为黑色时对象/文本为白色。之后,调用bwperim以便提取对象的周长,然后转换回来使对象文本为黑色,我们重新反转。

我得到的输出是:

enter image description here

bwperim优于imcontour的明显优势是bwperim提供了实际的输出图像,而imcontour只为您绘制了一个数字。您当然可以从图中提取图像数据,例如使用h = gcf; out = h.cdata;惯用法,但这将包括结果中的一些图形背景。我怀疑你想要实际的原始图像,所以我建议使用bwperim

我们如何在您链接的Freeman代码中使用它?

如果查看源代码,则需要输入两个输入:

  1. b,这是一个N x 2坐标矩阵,用于确定要编码的形状的边界
  2. unwrap - 可选参数
  3. 如果您想使用链接我们的功能,只需提取沿图像边界的像素的行和列坐标。因此,这是imcontour的另一个限制,因为您无法在没有原始轮廓图像本身的情况下确定这些位置。因此,您真正需要做的就是:

    [y,x] = find(out == 0);
    cc = chaincode([y x]);