1

给定一个图像,我想从中提取更多的子图像,但生成的子图像不能彼此过于相似。如果每个 ROI 的中心是随机选择的,那么我们必须确保每个子图像最多只有一小部分与其他子图像有共同的区域。或者我们可以将图像分解成规则网格上的小区域,然后我在每个区域内随机选择一个子图像。但是,此选项不能确保所有子图像彼此之间有足够的差异。显然我必须选择一个好的方法来比较生成的子图像,而且还要一个相似度阈值。

必须对许多图像执行上述过程:所有提取的子图像不应太相似。有没有办法从一组图像中识别出不太相似的区域(例如通过检查所有直方图)?

4

2 回答 2

2

由于您想将其应用于大量图像,并且您已经提出了建议,因此让我们讨论如何通过选择不同的图块来解决此问题。

第一步可能是定义什么是“相似”,因此需要一个相似性度量。您已经提到了瓦片的直方图作为指标的一种来源,但可能还有更多,例如:

  • 平均强度,
  • 强度的第 90 个百分位,
  • 强度的第 10 个百分位,
  • 强度模式,如直方图的峰值,
  • 整个图块中像素强度的变化,
  • 粒度,您可以通过原始图像和高斯滤波图像之间的差异或通过计算小子图块的平均方差来快速近似。

如果您的图像有两个通道,那么上面的列表已经为您留下了 12 个度量组件。此外,您可以从通道组合中获得一些特征,例如通道之间像素强度的相关性。两个通道只是一个特征,但三个通道已经是三个。

要从这个高维云中选择不同的图块,您可以考虑这些指标中的一些(如果不是很多)将是相关的,因此主成分分析 (PCA) 将是一个很好的第一步。http://en.wikipedia.org/wiki/Principal_component_analysis

然后,根据您想选择多少样本图块,您可以查看投影。例如,对于七个图块,我会查看前三个主成分,并从每个图块的两个极端中进行选择,然后还选择离中心最近的一个图块 (3 * 2 + 1 = 7)。

如果您担心从每个主成分的极端情况中进行选择可能不可靠,那么第 10 和第 90 个百分位数可能是稳健的。或者,您可以使用聚类算法来查找单独的示例,但这取决于您的云的外观。祝你好运。

于 2013-01-13T21:57:31.527 回答
2

n x n正如您所指出的,一种可能的方法是将图像拆分为正方形(保存边缘情况),将它们中的每一个减少为单个值并根据 k-最近值(与其他部分有关)对它们进行分组。将它们分组后,例如,您可以从每个组中选择一个图像。可能更好的方法是在每个组中使用更相关的指标,请参阅将 url 中的图像与 python 中的文件系统中的图像进行比较以获得两个这样的指标。通过使用此指标,您可以从每个组中选择多个。

这是一个使用我发现的一些鸭子的示例。它认为n = 128。为了将每一块减少到一个数字,它计算到纯黑色块的欧几里得距离n x n

f = Import["http://fohn.net/duck-pictures-facts/mallard-duck.jpg"];
pieces = Flatten[ImagePartition[ColorConvert[f, "Grayscale"], 128]]

在此处输入图像描述

black = Image[ConstantArray[0, {128, 128}]];
dist = Map[ImageDistance[#, black, DistanceFunction -> EuclideanDistance] &,
            pieces];
nf = Nearest[dist -> pieces];

然后我们可以通过考虑来查看分组k = 2

GraphPlot[
 Flatten[Table[
   Thread[pieces[[i]] -> nf[dist[[i]], 2]], {i, Length[pieces]}]],
 VertexRenderingFunction -> (Inset[#2, #, Center, .4] &), 
 SelfLoopStyle -> None]

在此处输入图像描述

现在,您可以在每个组中使用一个度量(比到黑色的距离更好)来从那里选择您想要的部分。

于 2013-01-13T22:02:22.230 回答