ruby – 近似具有多边形的形状

从包含透明区域和彩色区域的PNG图像中,我想生成具有N边(N是可配置的)的多边形,其近似于图像的最佳可能边缘.我希望这个多边形由一系列向量定义.

例如,让我们考虑下面的图像:link to plus.我可以设法通过计算每个像素周围的透明像素数来检测图像的边缘.我得到以下矩阵:

0000000000000000
0000053335000000
0000030003000000
0000030003000000
0000020002000000
0533210001233500
0300000000000300
0300000000000300
0300000000000300
0533210001233500
0000020002000000
0000030003000000
0000030003000000
0000053335000000
0000000000000000
0000000000000000

我认为,基于这个矩阵,我应该能够获得所有角落的坐标,从而得到向量,但我无法弄清楚如何.在这种情况下,我希望我的程序返回:

[7,2]->[11,2]
[11,6]
[11,6]->[15,6]
...

你们中有人有建议或链接吗?

最终,我还想要除90和0以外的近似角度,但这确实是第二阶段.

解决方法

我想你会发现CV工具包中的一些工具对你有用.您最好利用这些资源,而不是推出自己的解决方案.

我认为你有兴趣提取的两个特征是边角.

边缘,就像你想要的那样,可以让你走向形状的轮廓.你现在可能不感兴趣的是Edge Detection技术.这些将您的图像转换为边/空间的二进制图像.相反,您需要查看Hough Transform,它可以为您的图像中的每一行提供终点.如果你正在处理如你所定义的明确,实线,直线,这应该很好.你已经将你的问题标记为Ruby,所以也许你可以看看OpenCV(OpenCV是用C编写的,但是要绑定ruby-opencvjavacv个项目).这是Hough Transform documentation for OpenCV.然而,你可能会发现,Hough变换并没有为你提供连接线.这取决于图像中实际线条的规律性/不规则性.因此,您可能需要手动将线的端点连接到结构中.

角落可能对您提供的图像非常有效.标准算法是Harris corner detection.与Hough变换类似,您可以使用此技术返回图像中“最重要”的特征.已知该技术用于给出一致的结果,即使对于相同事物的不同图像也是如此.因此,它经常用于模式识别等.但是,如果您的图像与提供的图像一样简单,您可能能够以这种方式提取所有形状的角.获得图像的形状只需要在给定预定义的N边的情况下以有意义的方式连接点.

你绝对应该使用这两个功能空间,看看它们是如何工作的,你可以在音乐会上同时使用它们以获得更好的效果.

另外,如果您的图像确实是透明的颜色/强度,您可以将图像转换为‘binary image’.请注意,这不仅仅是二进制数据.相反,它意味着您只代表两种颜色,一种由0表示,另一种由1表示.这样做可以打开一整套适用于灰度和二值图像的工具.例如,您在上面手动计算的数字矩阵称为distance transformation,可以使用OpenCV等工具轻松高效地完成.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...