代码之家  ›  专栏  ›  技术社区  ›  Eugene Yokota

如何有效地将二维图像分割成具有相似值的区域/斑点?

  •  2
  • Eugene Yokota  · 技术社区  · 16 年前

    如何有效地将二维图像分割成类似值的斑点?给定的输入是一个整数数组,其中包括非灰色像素的色调和灰色像素的亮度。

    我用Java编写一个虚拟移动机器人,我用分割来分析地图和相机的图像。这是一个众所周知的问题 Computer Vision 但当它在机器人上运行时,性能确实很重要,所以我需要一些输入。算法才是最重要的,所以你可以用任何语言发布代码。

    5 回复  |  直到 16 年前
        1
  •  3
  •   implausibleusername    16 年前

    我会缩小样本,在色彩空间和像素数量上,使用视觉方法(可能是Meanshift)并放大结果。

    这是很好的,因为降采样还增加了对噪声的鲁棒性,使您更有可能获得有意义的段。

    如果需要平滑度,可以在之后使用泛光填充来平滑边缘。

    还有一些想法(回应你的评论)。

    1)当你降低采样率时,你混合了吗?y[i]=(x[2i]+x[2i+1])/2这应该可以消除噪音。

    2)你想要多快?

    3)您是否尝试过动态Meanshift?(所有算法x的动态x也是Google)

        2
  •  2
  •   Jonathan C Dickinson    16 年前

    不确定它是否太有效,但您可以尝试使用 Kohonen neural network (或自组织映射;som)对相似值进行分组,其中每个像素包含原始颜色和位置,并且只有颜色用于Kohohen分组。

    不过,在实现这一点之前,您应该先阅读一下,因为我对Kohonen网络的了解已经达到了将数据分组的程度——所以我不知道您的场景中有哪些性能/可行性选项。

    也有 Hopfield Networks . 它们可以根据我读到的内容被分成几组。

        3
  •  0
  •   Eugene Yokota    16 年前

    我现在拥有的:

    1. 创建与输入图像大小相同的缓冲区,初始化为 UNSEGMENTED .
    2. 对于图像中的每个像素,对应的缓冲区值不是 未分割的 ,使用像素值填充缓冲区。

      a.通过检查像素是否在 EPSILON (当前设置为10)原始像素值。

      B. Flood filling algorithm .

    可能的问题:

    2.A.的边界检查在洪水填充算法中被多次调用。如果我可以使用边缘检测预先计算边界,我可以将其转换为查找,但这可能会比当前检查增加更多的时间。

    private boolean isValuesCloseEnough(int a_lhs, int a_rhs) {
        return Math.abs(a_lhs - a_rhs) <= EPSILON;
    }
    

    可能的增强:

    而不是检查每个像素 未分割的 我可以随便选几点。如果你预计会有10个斑点,那么按照这个顺序随机选取点就足够了。缺点是你可能会错过一个有用但很小的斑点。

        4
  •  0
  •   yacdmnky    16 年前

    看看眼罩(眼罩,斯坦福大学,edu)。在调查阶段,它应该通过提供各种可能的分割过滤器来帮助您。

        5
  •  0
  •   graveca    16 年前

    洪水填充的另一种选择是 connnected-components 算法。所以,

    1. 便宜地分类你的像素。例如,在颜色空间中划分像素。
    2. 运行cc以查找blob
    3. 保留大尺寸的斑点

    这种方法在早期视觉方法中被广泛使用。例如在开创性的论文中” Blobworld: A System for Region-Based Image Indexing and Retrieval “。

    推荐文章