【问题标题】:Matlab matrix cropping of clusters聚类的Matlab矩阵裁剪
【发布时间】:2012-01-15 10:29:36
【问题描述】:

给定一个矩阵:

0 0 0 0 0 0 0 0
0 0 0 1 1 1 0 0
0 0 1 1 0 1 0 1
0 0 1 1 0 1 0 0
0 0 0 0 1 0 0 0

注意除了第三行最后一列中的 1 之外,1 主要是如何聚集的

我想要做的是去掉多余的 0,只保留 1 的簇。这就是我要对图像执行的操作,因此裁剪后的结果应该是矩形:

0 1 1 1 
1 1 0 1
1 1 0 1
0 0 1 0

上面的裁剪是我可以做的最小的矩形裁剪,以覆盖最多的 1。

我现在遇到的问题是如何在 matlab 中做到这一点?我不能简单地去掉所有的 0,我必须注意异常值 1。解决这个问题最有效的方法是什么?

我只能想到手动逐行逐列地寻找集群。

【问题讨论】:

    标签: matlab image-processing matrix


    【解决方案1】:

    您尝试做的相当于在二值图像中标记二维连接组件。如果你可以访问图像处理工具箱,函数是bwlabel:http://www.mathworks.com/help/toolbox/images/ref/bwlabel.html

    如果您无权访问bwlabel,则可以使用多种算法。我所知道的最快的是 OpenCV 使用的一种,它在图像中找到闭合轮廓并基于

    F。常,C.-J。陈和 C.-J。卢,“线性时间组件标记 使用轮廓跟踪技术的算法,”计算机视觉和图像 了解,卷。 93,没有。 2,第 206-220 页,2004 年

    【讨论】:

    • 哈哈,谢谢,我刚刚也发现了 bwlabel。但是如果我有 2 个非常靠近的集群怎么办?是否有内置函数来确定 bwlabel 中确定的集群是否有附近的邻居?
    • 我不确定你的意思。只要集群用零分隔,它们就会作为单独的组件返回。如果您想“模糊”组件,那么最好的办法可能是事先进行一些图像处理。例如,如果您希望将相距不超过 2 个像素的 blob 视为一个,则将图像扩大 2 个像素。如果你想分离重叠的斑点,那么你就会陷入一罐全新的蠕虫中:)(顺便说一句,这是我心中最亲爱的一个)
    • 我在这里处理显着图,这里的二进制矩阵决定了原始图像的哪个部分是显着的。对于显着性地图,通常有一组标记为显着的图像,这些集群可能彼此相距很远,但仍应属于同一集群的一部分。由于之后我 SIFT 这些图像,我无法进行任何类型的处理。
    • 你不能对二进制图像(或它的副本)进行处理然后丢弃它吗?另一种选择是对二值图像进行二次采样 - 即,如果集群可以相隔 1 个像素,则使用 bwlabel(B([1 : 2 : end],[1 : 2 : end])),分隔为 2 个像素做 [1 : 3 : end] 等。这是迄今为止最快的方法,但除了 2 的幂之外它不起作用,你必须小心如何转换回原始坐标。
    • 哈哈我正在写一些相当复杂的函数来计算簇之间的质心距离。现在想来,随着模糊,图像中显着对象的位置并没有改变。不过,我需要非常强烈的像素模糊,可能相隔 10 个像素。与其他方法相比,我不知道这对 CPU 的占用程度如何,但这绝对是最简单的。我应该应用什么类型的特殊过滤器?
    猜你喜欢
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2015-04-20
    • 2012-05-08
    • 2014-07-30
    • 1970-01-01
    • 2023-03-17
    • 2023-03-12
    相关资源
    最近更新 更多