首页 > 解决方案 > 图像比较算法

问题描述

所以我看着一张图片,并试图从一组最相似(差异最小)的其他图片中选择一个。

目前我只是看每个像素的 RGB 部分之间的平均差异,但这有选择灰色的趋势。如果一半图片是白色而另一半是黑色,即使图片中没有灰色,它也会选择一些灰色阴影。

我假设有更好的算法来比较图像或尝试实现我想要做的事情。

请注意,图像的实际内容并不那么有趣,只是颜色“看起来”相似。

为了记录,我试图做的是将某人的衣服与纹理文件相匹配,如果这有什么不同的话。

任何关于某些资源方向的建议或观点将不胜感激。

编辑:我的解决方案是从我选择的集合中删除灰色,并且效果很好,如果其他人有任何更好的解决方案,请随时发布。

标签: c#.netimage-processingimage-comparison

解决方案


我昨天刚刚发布了这个,我不想重复这个帖子,但它非常相似。

从位图对象制作更小的位图

我的开源项目 Transparency Maker 创建了一个 Pixel Database,它实际上是一个 PixelInformation 对象的列表。

每个像素当然有 Red Green Blue 的属性,但也有 Total、BlueGreen、BlueRed 和 GreenRed 的属性,即 Blue + Green、Blue + Red 等的总和。

然后,您可以执行 Linq 查询或每个循环并比较两个像素(像素信息类)的总数,然后您可以比较不同的内容,例如:

比较总数很简单:

int difference = pixel1.Total - pixel2.Total;

如果您使用标准位图,这与键入所有这些内容相同:

int redDiff = Pixel1.Red - Pixel2.Red;
int green = Pixel1.Green - Pixel2.Green;
int blueDiff = Pixel1.Blue - Pixel2.Blue;
int diff = redDiff + greenDiff + blue;

作为一个想法,您可以将您的算法改进为每个差异的权重更大,因此对于上面的最后一行可能是:

int difference = (redDiff * 17) + (greenDiff * 17) + (blueDifference * 17);

我只是编了17个例子,你用它的重量值是多少取决于你。

从理论上讲,以上内容将为您提供更接近图像的更接近的数字。

如果你想要完整的代码,这里是我的开源项目的链接: https ://github.com/DataJuggler/TransparencyMaker

也许这会给你一些想法。


推荐阅读