我正在图像中的某些区域上使用MATLAB。我正处于这样一个阶段,我希望能够将区域表现出某种规律性(例如,圆形或方形)区域,这些区域与任何已知图形不相似,并且对于我的应用而言仅仅是噪音。我将使用描述性MS Paint图像来说明这一点:
是否有任何工具大部分时间(或者甚至更少,我知道这不可能是100/100)会将红色的东西识别为不同
我会在一张图片中处理很多形状,所以我不介意我沿途携带一些红色怪物,只要它们中的大多数被踢掉。当然我知道这些区域的索引,所以我可以在MATLAB中操作它们。
许多算法都浮现在脑海中,例如,获取边界并检查其规律性/它改变曲率的次数/ ......,检查不同列的垂直长度变化(线性特征几乎为0,真的红色的东西很高,... ...
但是我希望从那里的工具中得到一些帮助。如果这个工具不能涵盖所有情况都没关系(例如,会踢出圈子),我已经非常广泛地获得了你们的最大输入数量 - 任何工具都会鼓舞人心并且很有帮助(以及然而,我们不能指望对更深层次的问题有一个完美的答案 - 识别常规形状 - 这看起来更像是AI研究领域。我也认为,虽然广泛,但这完全是非主观的,所以应该适合SO。谢谢。
旁注1 :我主要处理像右上角那样细长的扩展功能,所以圈子并不相关。
旁注2 :为了100%清晰,我需要一些东西(无论是已经存在的工具,还是你指出的一些想法)作用于形状的指数,行 - 列的术语到原始图像,或在形状本身的边界上。
附注3 :除了工具/建议/想法之外,欢迎您写下一些代码行;)我将这些区域作为连接组件来自bwconncomp
。
答案 0 :(得分:1)
我最近必须解决一个类似的问题,包括计算图像中blob的缩进数量(基本上是bwconncomp返回的连接组件)。我使用的方法是查看通过FFT计算的沿边界的曲率变化。在您的情况下,红色斑点会有大量的曲率变化,而黑色区域则不会。这是一个非常简单的计算,而且速度相对较快。代码在github上:
https://github.com/mjsottile/blobdents
感兴趣的文件是src / countindents.m。该方法的简短描述如下:
答案 1 :(得分:0)
@Mikhail在评论中提出了更轻松的道路。
我发现regionprops
有一个非常有用的工具Solidity
。引用文档,
返回一个标量,指定凸包中的像素在该区域中的比例。计算为Area / ConvexArea。
凸壳被定义为可以包含该区域的最小凸多边形。因此Solidity
如果形状是规则的并且没有凸起变化则会上升到1;我的红色形状下降到0,在它自己和凸多边形之间留下空间。
当然它永远不会达到0,最低值应属于一种 +
形符号。