Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法从一组图像中识别出不太相似的区域?_C++_Image Processing_Opencv - Fatal编程技术网

C++ 有没有办法从一组图像中识别出不太相似的区域?

C++ 有没有办法从一组图像中识别出不太相似的区域?,c++,image-processing,opencv,C++,Image Processing,Opencv,给定一个图像,我想从中提取更多的子图像,但生成的子图像不能彼此过于相似。如果每个ROI的中心应该随机选择,那么我们必须确保每个子图像最多只有一小部分区域与其他子图像相同。 或者我们可以将图像分解成一个规则网格上的小区域,然后我在每个区域内随机选择一个子图像。但是,此选项不能确保所有子映像彼此之间有足够的差异。显然,我必须选择一种比较结果子图像的好方法,而且还要选择一个相似性阈值 以上步骤必须在许多图像上执行:所有提取的子图像不应太相似。有没有一种方法可以通过检查所有直方图来从一组图像中识别出与e

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


以上步骤必须在许多图像上执行:所有提取的子图像不应太相似。有没有一种方法可以通过检查所有直方图来从一组图像中识别出与eg不太相似的区域?

由于您希望将此方法应用于大量图像,并且您已经提出了建议,让我们讨论如何通过选择不同的分幅来解决此问题

第一步可能是定义什么是相似性,因此需要一个相似性度量。您已经提到了瓷砖的柱状图作为度量的一个来源,但可能还有更多,例如:

平均强度, 强度的第90百分位, 强度的第10百分位, 强度模式,如直方图的峰值, 整个瓷砖中像素强度的变化, 粒度,您可以通过原始图像和高斯滤波图像之间的差异,或者通过计算小分块中的平均方差,快速近似粒度。 如果您的图像有两个通道,上面的列表将为您留下12个公制组件。此外,还可以从通道组合中获得一些特性,例如通道之间像素强度的相关性。有两个通道,这只是一个特征,但有三个通道,它已经是三个了

从这个高维云中选择不同的瓦片,你可以考虑一些与这些度量不相关的部分,因此主成分分析PCA将是一个很好的第一步。p> 然后,根据您希望选择的示例瓷砖数量,可以查看投影。例如,对于七个瓷砖,我将查看前三个主成分,并从每个主成分的两个极端中进行选择,然后还选择离中心最近的一个瓷砖3*2+1=7


如果您担心从每个主成分的极端选择可能不可靠,则第10和第90个百分位可能不可靠。或者,您可以使用集群算法来查找单独的示例,但这取决于云的外观。祝您好运。

既然您希望将此应用于大量图像,并且您已经提出了建议,那么让我们讨论如何通过选择不同的平铺来解决此问题

第一步可能是定义什么是相似性,因此需要一个相似性度量。您已经提到了瓷砖的柱状图作为度量的一个来源,但可能还有更多,例如:

平均强度, 强度的第90百分位, 强度的第10百分位, 强度模式,如直方图的峰值, 整个瓷砖中像素强度的变化, 粒度,您可以通过原始图像和高斯滤波图像之间的差异,或者通过计算小分块中的平均方差,快速近似粒度。 如果您的图像有两个通道,上面的列表将为您留下12个公制组件。此外,还可以从通道组合中获得一些特性,例如通道之间像素强度的相关性。有两个通道,这只是一个特征,但有三个通道,它已经是三个了

从这个高维云中选择不同的瓦片,你可以考虑一些与这些度量不相关的部分,因此主成分分析PCA将是一个很好的第一步。p> 然后,根据您希望选择的示例瓷砖数量,可以查看投影。例如,对于七个瓷砖,我将查看前三个主成分,并从每个主成分的两个极端中进行选择,然后还选择离中心最近的一个瓷砖3*2+1=7


如果您担心从每个主成分的极端选择可能不可靠,则第10和第90个百分位可能不可靠。或者,您可以使用集群算法来查找单独的示例,但这取决于云的外观。祝你好运。

一种可能的方法是将你的图像分割成n x n个正方形。如你所指出的,保存边缘情况,将它们减少为单个值,并根据与其他部分相关的k-最近值对它们进行分组。分组后,可以从每组中选择一个图像。 可能更好的方法是在每个组中使用一个更相关的度量,请参阅以获取两个这样的度量。通过使用此度量,您可以从每组中选择多个工件

下面是一个使用我在附近找到的鸭子的例子。它考虑n=128。为了将每个片段减少为一个数字,它计算到一个n x n的纯黑色片段的欧几里德距离

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


现在,您可以在每个组中使用比“到黑色的距离”更好的度量来选择所需的图像块。

一种可能的方法是将图像分割为n x n个正方形,如您所指出的,保存边缘情况,将它们中的每一个减少为一个值,并根据与其他工件相关的k-最近值对它们进行分组。分组后,可以从每组中选择一个图像。可能更好的方法是在每个组中使用一个更相关的度量,请参阅以获取两个这样的度量。通过使用此度量,您可以从每组中选择多个工件

下面是一个使用我在附近找到的鸭子的例子。它考虑n=128。为了将每个片段减少为一个数字,它计算到一个n x n的纯黑色片段的欧几里德距离

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


现在,您可以在每个组中使用一个比“到黑色的距离”更好的度量来选择所需的碎片。

您知道,有许多不同的方法可以实现这一点,而大多数方法都不会满足您的需要。这是因为您根本没有指定您想要什么。如何定义一个图像与另一个图像是否有足够的差异?有很多度量,很多颜色空间,你在使用彩色图像吗?@mmgp:我需要训练一个分类器,因此我需要很多指定大小的负样本。但是,我有更大的图像,所以我应该从这些图像中提取负片样本。样品必须是灰度的。你知道,有很多不同的方法来做这样的事情,大多数都不会做你想做的。这是因为您根本没有指定您想要什么。如何定义一个图像与另一个图像是否有足够的差异?有很多度量,很多颜色空间,你在使用彩色图像吗?@mmgp:我需要训练一个分类器,因此我需要很多指定大小的负样本。但是,我有更大的图像,所以我应该从这些图像中提取负片样本。样本必须是灰度的。根据你的想法,我可以将所有图像分割成n x n个正方形,并使用给定的度量将每个正方形减少为单个值。最后,我可以将计算出的值分组,例如,按照您指出的k-最近值,并从每组中选择一个或多个图像。最初我理解您的问题与单个图像中的面片选择有关,这将针对您拥有的每个图像分别进行。但你也可以像上面提到的那样,将其扩展到不同面片的面片,因为这是对所提出的想法的直接修改。根据你的想法,我可以将所有图像分割为n x n个正方形,并使用给定的度量将每个正方形减少为单个值。最后,我可以将计算出的值分组,例如,按照您指出的k-最近值,并从每组中选择一个或多个图像。最初我理解您的问题与单个图像中的面片选择有关,这将针对您拥有的每个图像分别进行。但是你也可以像上面提到的那样,将它扩展到各种补丁中的补丁,因为这是对所提出想法的直接修改。
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];
GraphPlot[
 Flatten[Table[
   Thread[pieces[[i]] -> nf[dist[[i]], 2]], {i, Length[pieces]}]],
 VertexRenderingFunction -> (Inset[#2, #, Center, .4] &), 
 SelfLoopStyle -> None]