文件交换的选择

我们最好的用户提交

跟踪一个二进制的边界地区的形象

布雷特本周的选择Freeman链码,通过尼古拉斯Douillet

内容

一个新文件提示一个思维实验

我从来没有这样做过,但我决定写一个文件,刚刚上线今天(在我写这篇文章)!我很兴奋看到这张图片伴随尼古拉斯的提交:

说实话,我从来没有听说过“Freeman链码,但我确实是这样想的很多图像处理,跟踪二进制的边界地区经常方便,选择始终是一件好事。我不熟悉尼古拉斯的工作;他65年文件交换的贡献已经下载了成千上万次,并获得一些五星级的评级。这里有很多好东西,甚至一个函数我有点害怕。(读“概述”,你就会明白了。)

Freeman链码

开始,我通常做的事情,在维基百科(我经常爱和支持维基百科,尽管我孩子的老师不会允许他们使用的资源),我做了一点金宝app阅读有关Freeman链码。它本质上是一个边界跟踪为二进制图像压缩算法。

尼古拉斯的实现

尼古拉斯·弗里曼算法的实现没有任何MathWorks工具箱依赖性;它运行在核心MATLAB。所以,如果你有图像处理工具箱(IPT),您需要跟踪一个独奏二进制地区没有洞,这个函数是美丽的:

% (“gear.jpg”是一个文件,尼古拉与他共享条目。)我= imread (“gear.jpg”);I = imbinarize(我);(代码、row_idx0 col_idx0) = Freeman_chain_code(我,假);%注意:第二个输入参数是一个“冗长”旗帜,触发可视化%的输出。(我在这里镇压可视化因为上面所示的输出)。

图像处理工具箱

所以这里开始变得更有趣。当然,IPT等效的方法生成相同的信息,所以我想做一个简单的比较:

使用图像处理工具箱的功能:

[B, L] = bwboundaries(我8);Contour2 = false(大小(L));2 = 1:元素个数(B) thisB = B {2};第1 = sub2ind(大小(L), thisB (: 1), thisB (:, 2));Contour2(第1)= 1;结束imshow (Contour2)标题(“使用bwboundaries”)

的界限相同的。(事实上很容易验证,至少在这种情况下,他们实际上,相同的)。

时间比较如何?

我建议时间当你想准确evalutate函数运行时间:

fcn = @ () Freeman_chain_code(我,假);t_Freeman时间= (fcn);

定义一个函数来捕获IPT的功能:

函数Io = calcBoundaries (I) [B, L] = bwboundaries(我8);Io = false(大小(L));2 = 1:元素个数(B) thisB = B {2};第1 = sub2ind(大小(L), thisB (: 1), thisB (:, 2));Io(第1)= 1;结束结束

…我们同样有:

fcn = @ () calcBoundaries(我);t_IPT时间= (fcn);
> >流(“弗里曼:% 0.5 f秒;\ nIPT: % 0.5 f秒\ n '弗里曼、t_Freeman t_IPT): 0.00024秒;IPT: 0.00090秒

他们都非常快。令人惊讶的是,弗里曼边界检测比工具箱功能更快,对于这个特定的形象。(这不是近在某种程度上,进行验证bwboundaries是。)

更复杂的图像呢?

但现在让情况更为复杂。假设我们有一个二进制图像包含多个感兴趣的区域(roi):

我= imread (“coins.png”);我= imfill (imbinarize(我),“黑洞”);Freeman_chain_code(我,真的);

有趣的…Freeman链码只返回单个轮廓——第一区域检测(MATLAB意义上)。

此外,即使你有一个单独的区域,但该地区(即有一个或多个漏洞。,如果欧拉数图像的小于1),尼古拉斯的功能只会捕捉到该地区的轮廓!

我= false (300);我(150、150)= true;I = bwdist(我);我= > 15 & < 50;
[~,~,~,轮廓]= Freeman_chain_code_modified(我,假);
Contour2 = calcBoundaries(我);次要情节(2,2,1:2);imshow (I)标题(“原始”次要情节(2,2,3)imshow(轮廓)标题(弗里曼的次要情节(2,2,4)imshow (Contour2)标题(“bwbounaries”)

我冒昧的修改尼古拉斯的代码来适应多个区域。(在这一过程中,我使用了一些功能从IPT !)在修改后的版本中,我在while循环包装的整个过程,并设置在每个ROI 0像素处理。我还添加了“轮廓”的输出参数,当我发现它往往是最有用的方面的边界跟踪工作流)。最后:

(代码,a, b,轮廓)= Freeman_chain_code_modified(我,真的);

但即使现在适应多个roi的代码,它仍然不工作我需要包含漏洞的roi。此外,弗里曼代码现在几次修改bwboundaries的方法。

两个建议

谢谢,尼古拉斯,提交,和许多其他的!代码实现,非常有用,特别是对于那些没有访问图像处理工具箱,并有简单的roi来处理。我希望看到一个引文弗里曼的算法中提到你的工作,我希望看到“帮助”评论充实一点帮助文件的用户。最后,这将是有用的,如果你将包括“轮廓”包括在你的输出列表。(虽然这是对任何人都很容易修改。)尽管如此,真正坚实的工作:发人深省的,感谢!

像往常一样,我欢迎你想法和意见




发表与MATLAB®R2020b

|
  • 打印
  • 发送电子邮件

评论

要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。