基于边缘强度聚类数据点
Clustering data points based on edge strength
我正在研究一个计算机视觉应用程序,我试图在其中分析某组颜色与另一种颜色形成的边缘强度。为此,我拍摄了两种颜色相互重叠的图像,并记录了一对颜色的边缘强度(我通过 Canny 边缘检测获得的归一化值)。
现在,如果我为每个颜色对绘制此边缘强度图,我会得到如下图:
图中每个点代表两种颜色之间的边缘强度,这两种颜色由具有两个 RGB 元组的字符串表示。
基于这个边缘强度数据,我想将使用的颜色聚类成 k 个聚类(k 已知但任意)。聚类应该对颜色进行分组,使得边缘强度低的颜色对组合在一起,而边缘强度高的颜色对最终在不同的聚类中。例如,如果白色和黄色具有高边缘强度,我希望它们位于不同的簇中。如果白色和灰色的边缘强度较低,我希望它们在同一簇中。即使数据在颜色对之间,我也希望得到一个集群由一组颜色组成的结果。
我认为这很简单,k 表示聚类,但是由于颜色对的数据和两对之间的边缘强度,我无法理解如何预处理数据以便我可以聚类数据并获得颜色根据我的要求。我可以知道如何使用 k-means 或任何其他方法解决我的问题吗?
编辑:在应用边缘检测之前,我自己完成了平滑、分割。没有这个,边缘检测就会有太多的噪音。我在每个通道中应用了边缘检测,并将它们归一化并添加以获得强边缘。这一切都很好,虽然它改变了原始颜色,这是无可奈何的,但它给出了图表中显示的不错的结果。
另一项编辑:现实世界的影响(反照率、入射角)使颜色发生很大变化。实际上,单独获取颜色值并计算颜色值并不能给出当一种颜色落在另一种颜色上时出现的实际结果颜色。
提前致谢!
首先,Canny检测器通常在灰度图像上执行。如果您使用的是像 opencv 这样的库,您的 rgb 图像很可能是在后台转换的。
我假设当您说 "edge strength between two colors" 时,您会认为图像的一半是一种颜色,另一半是另一种颜色。如果您只想要此类图像中边缘的强度,则不需要边缘的方向。你也不需要图像。边缘的强度只是两个强度的差异,这很好,因为如果你的距离度量是可传递的,你可以使用 k-means。
如果您有 rgb 颜色,只需将它们转换为灰度并使用 k-means 将它们分组。
另一件事是,如果您使用库中的 canny,它可能会在计算您可能不需要的强度之前应用一些平滑。
K 均值聚类使用每个观察值,而不是它们之间的关系。因此,如果您想以现有的形式对数据进行聚类,您可以使用其他一些将成对关系作为输入的聚类方法。 Hierarchical clustering can be one example. Another method that can be implemented in a way that accepts pairwise proximity matrix is DBSCAN
如果你能理解边缘强度取决于颜色值的规律,你就可能获得颜色在某个坐标 space 中的绝对位置,并通过 k-means 聚类。例如,如果您将强度测量为 RGB 中的欧几里德距离 - 您可以简单地通过颜色的 RGB 值进行 k-means。但是看看你的数据,你的边缘强度似乎与 RGB 欧几里德距离不成正比。
我正在研究一个计算机视觉应用程序,我试图在其中分析某组颜色与另一种颜色形成的边缘强度。为此,我拍摄了两种颜色相互重叠的图像,并记录了一对颜色的边缘强度(我通过 Canny 边缘检测获得的归一化值)。
现在,如果我为每个颜色对绘制此边缘强度图,我会得到如下图:
图中每个点代表两种颜色之间的边缘强度,这两种颜色由具有两个 RGB 元组的字符串表示。
基于这个边缘强度数据,我想将使用的颜色聚类成 k 个聚类(k 已知但任意)。聚类应该对颜色进行分组,使得边缘强度低的颜色对组合在一起,而边缘强度高的颜色对最终在不同的聚类中。例如,如果白色和黄色具有高边缘强度,我希望它们位于不同的簇中。如果白色和灰色的边缘强度较低,我希望它们在同一簇中。即使数据在颜色对之间,我也希望得到一个集群由一组颜色组成的结果。
我认为这很简单,k 表示聚类,但是由于颜色对的数据和两对之间的边缘强度,我无法理解如何预处理数据以便我可以聚类数据并获得颜色根据我的要求。我可以知道如何使用 k-means 或任何其他方法解决我的问题吗?
编辑:在应用边缘检测之前,我自己完成了平滑、分割。没有这个,边缘检测就会有太多的噪音。我在每个通道中应用了边缘检测,并将它们归一化并添加以获得强边缘。这一切都很好,虽然它改变了原始颜色,这是无可奈何的,但它给出了图表中显示的不错的结果。
另一项编辑:现实世界的影响(反照率、入射角)使颜色发生很大变化。实际上,单独获取颜色值并计算颜色值并不能给出当一种颜色落在另一种颜色上时出现的实际结果颜色。
提前致谢!
首先,Canny检测器通常在灰度图像上执行。如果您使用的是像 opencv 这样的库,您的 rgb 图像很可能是在后台转换的。
我假设当您说 "edge strength between two colors" 时,您会认为图像的一半是一种颜色,另一半是另一种颜色。如果您只想要此类图像中边缘的强度,则不需要边缘的方向。你也不需要图像。边缘的强度只是两个强度的差异,这很好,因为如果你的距离度量是可传递的,你可以使用 k-means。
如果您有 rgb 颜色,只需将它们转换为灰度并使用 k-means 将它们分组。
另一件事是,如果您使用库中的 canny,它可能会在计算您可能不需要的强度之前应用一些平滑。
K 均值聚类使用每个观察值,而不是它们之间的关系。因此,如果您想以现有的形式对数据进行聚类,您可以使用其他一些将成对关系作为输入的聚类方法。 Hierarchical clustering can be one example. Another method that can be implemented in a way that accepts pairwise proximity matrix is DBSCAN
如果你能理解边缘强度取决于颜色值的规律,你就可能获得颜色在某个坐标 space 中的绝对位置,并通过 k-means 聚类。例如,如果您将强度测量为 RGB 中的欧几里德距离 - 您可以简单地通过颜色的 RGB 值进行 k-means。但是看看你的数据,你的边缘强度似乎与 RGB 欧几里德距离不成正比。