是否有针对图像内部区域的规律性检测工具?
Is there any regularity-detection tool for regions inside an image?
我正在使用 MATLAB 处理图像中的某些区域。我正处于这样一个时刻,我希望能够将表现出某种规律性(例如圆形或方形)的区域与不类似于任何已知图形并且对于我的应用程序是仅仅是噪音。我将使用描述性的 MS Paint 图像对此进行说明:
有没有什么工具可以让大多数时候(甚至更少,我知道这不可能是 100/100)将红色的东西识别为 不同?
我会在一个图像中处理很多形状,所以我不介意一路上携带一些红色怪物,只要把它们中的大部分都踢掉就行。我当然知道这些区域的索引,所以我可以在 MATLAB 中操作它们。
许多算法浮现在脑海中,例如,获取边界并检查其 regularity/the 改变曲率的次数/...,检查不同列的垂直长度变化(几乎为 0线性特征,对于红色的东西来说真的很高),...
但是我希望能从那里的工具中得到一些帮助。如果这个工具不能涵盖所有情况(例如,将踢出圈子),这并不重要,我已经非常广泛地从你们那里获得最大数量的输入 - 任何工具都会鼓舞人心和有帮助(并且,但是,对于更深层次的问题——识别规则形状——这似乎更像是一个 AI 研究领域,我们不能期待一个完美的答案。我还认为,虽然范围很广,但这完全是非主观的,因此应该适合 SO。谢谢。
旁注 1:我将主要处理细长的、扩展的特征,例如右上角的特征,因此圆圈不是那么相关。
旁注 2:为了 100% 清楚,我需要一些作用于指数的东西(无论是已经存在的工具,还是您指出的一些想法)形状,根据原始图像的行列,或形状本身的边界。
旁注 3:除了 tools/suggestions/ideas,欢迎您写下一些代码行;)我得到的区域是 来自 bwconncomp
.
的连接组件
我最近不得不解决一个类似的问题,涉及计算图像中 blob 上的缩进数(基本上是 bwconncomp 返回的连通分量)。我使用的方法是查看沿通过 FFT 计算的边界的曲率变化。在您的情况下,红色斑点会有大量曲率变化,而黑色区域则不会。这是一个非常简单的计算,而且速度相对较快。代码在 github 此处:
https://github.com/mjsottile/blobdents
感兴趣的文件是 src/countindents.m。该方法的简短描述如下:
我选择了@Mikhail 在评论中建议的更简单的方法。
我发现 regionprops
有一个非常有用的工具,叫做 Solidity
。引用文档,
Returns a scalar specifying the proportion of the pixels in the convex hull that are also in the region. Computed as Area/ConvexArea.
凸包定义为可以包含该区域的最小凸多边形。所以 Solidity
如果形状有点规则并且没有凸度变化,则上升到 1;我的红色形状下降到 0,它在自身和凸多边形之间留下 space。
当然永远不会到0,最低值应该属于一种+
形的符号。
我正在使用 MATLAB 处理图像中的某些区域。我正处于这样一个时刻,我希望能够将表现出某种规律性(例如圆形或方形)的区域与不类似于任何已知图形并且对于我的应用程序是仅仅是噪音。我将使用描述性的 MS Paint 图像对此进行说明:
有没有什么工具可以让大多数时候(甚至更少,我知道这不可能是 100/100)将红色的东西识别为 不同?
我会在一个图像中处理很多形状,所以我不介意一路上携带一些红色怪物,只要把它们中的大部分都踢掉就行。我当然知道这些区域的索引,所以我可以在 MATLAB 中操作它们。
许多算法浮现在脑海中,例如,获取边界并检查其 regularity/the 改变曲率的次数/...,检查不同列的垂直长度变化(几乎为 0线性特征,对于红色的东西来说真的很高),...
但是我希望能从那里的工具中得到一些帮助。如果这个工具不能涵盖所有情况(例如,将踢出圈子),这并不重要,我已经非常广泛地从你们那里获得最大数量的输入 - 任何工具都会鼓舞人心和有帮助(并且,但是,对于更深层次的问题——识别规则形状——这似乎更像是一个 AI 研究领域,我们不能期待一个完美的答案。我还认为,虽然范围很广,但这完全是非主观的,因此应该适合 SO。谢谢。
旁注 1:我将主要处理细长的、扩展的特征,例如右上角的特征,因此圆圈不是那么相关。
旁注 2:为了 100% 清楚,我需要一些作用于指数的东西(无论是已经存在的工具,还是您指出的一些想法)形状,根据原始图像的行列,或形状本身的边界。
旁注 3:除了 tools/suggestions/ideas,欢迎您写下一些代码行;)我得到的区域是 来自 bwconncomp
.
我最近不得不解决一个类似的问题,涉及计算图像中 blob 上的缩进数(基本上是 bwconncomp 返回的连通分量)。我使用的方法是查看沿通过 FFT 计算的边界的曲率变化。在您的情况下,红色斑点会有大量曲率变化,而黑色区域则不会。这是一个非常简单的计算,而且速度相对较快。代码在 github 此处:
https://github.com/mjsottile/blobdents
感兴趣的文件是 src/countindents.m。该方法的简短描述如下:
我选择了@Mikhail 在评论中建议的更简单的方法。
我发现 regionprops
有一个非常有用的工具,叫做 Solidity
。引用文档,
Returns a scalar specifying the proportion of the pixels in the convex hull that are also in the region. Computed as Area/ConvexArea.
凸包定义为可以包含该区域的最小凸多边形。所以 Solidity
如果形状有点规则并且没有凸度变化,则上升到 1;我的红色形状下降到 0,它在自身和凸多边形之间留下 space。
当然永远不会到0,最低值应该属于一种+
形的符号。