我正在研究计算机视觉应用程序,我尝试用另一种颜色分析某组颜色的边缘强度。因为,我将两种颜色的图像放在一起,并记录一对颜色的边缘强度(通过Canny边缘检测得到的标准化值)。
现在,如果我为每个颜色对绘制这个边缘强度图,我会得到如下图:
在图表中,每个点代表两种颜色之间的边缘强度,由具有两个RGB元组的字符串表示。
基于该边缘强度数据,我想将所使用的颜色聚类成k个聚类(k是已知的但是任意的)。簇应该对颜色进行分组,使得具有低边缘强度的颜色对被分组在一起,并且具有高边缘强度的颜色对最终在不同的簇中。例如,如果白色和黄色具有高边缘强度,我希望它们位于不同的簇中。如果白色和灰色的边缘强度较低,我希望它们位于同一个簇中。即使数据在颜色对之间,我也希望得到一个结果,其中聚类由一组颜色组成。
我认为这是直接的,k意味着聚类,但由于两对之间的颜色对和边缘强度的数据,我无法理解如何预处理数据,以便我可以聚类数据并获得颜色我的要求。我可以知道如何用k-means或任何其他方法解决我的问题?
编辑:在应用边缘检测之前,我已经完成了自己的平滑,分割。如果没有这个,边缘检测就会产生太多的噪音。我已经在每个通道中应用了边缘检测,并将其标准化并添加它们以获得强大的优势。这一切都很好用,虽然它改变了原来的颜色,这是无法帮助的,它给出了图中显示的不错的结果。
另一种编辑:现实世界的影响(反照率,入射角)会改变颜色。实际上,分别获取颜色值并计算颜色值并不会给出当颜色落在另一个上时发生的实际结果颜色。
提前致谢!
答案 0 :(得分:2)
K-means聚类使用每个观察值,而不是它们之间的关系。因此,如果您希望以您拥有的形式对数据进行聚类,则可以使用其他聚类方法将成对关系作为输入。 Hierarchical clustering可以是一个例子。可以以接受成对接近矩阵的方式实现的另一种方法是DBSCAN
如果您能够理解边缘强度取决于颜色值的规律,您可以在某些坐标空间中获得颜色的绝对位置,并通过k-means获得颜色的绝对位置。例如,如果您在RGB中测量欧几里德距离的强度 - 您可以简单地通过颜色的RGB值进行k均值。但是看看你的数据,看起来你的边缘强度与RGB欧几里德距离不成比例。
答案 1 :(得分:1)
首先,通常在灰度图像上执行精确检测器。如果您使用的是像opencv这样的库,那么您的rgb图像很可能会在引擎盖下进行转换。
我认为当你说“两种颜色之间的边缘强度”时,你会想到它就像一半图像是一种颜色而另一半是另一种颜色。如果您只想要这种图像中边缘的强度,则不需要边缘的方向。您也不需要图像。边缘的强度只是两个强度的差异,这很好,因为如果距离度量是可传递的,你可以使用k均值。
如果你有rgb颜色,只需将它们转换为灰度并用k-means将它们分组。
另一件事是,如果你使用库中的canny,它可能会在计算你可能不需要的强度之前应用一些平滑。