c# - 图像比较算法
问题描述
所以我看着一张图片,并试图从一组最相似(差异最小)的其他图片中选择一个。
目前我只是看每个像素的 RGB 部分之间的平均差异,但这有选择灰色的趋势。如果一半图片是白色而另一半是黑色,即使图片中没有灰色,它也会选择一些灰色阴影。
我假设有更好的算法来比较图像或尝试实现我想要做的事情。
请注意,图像的实际内容并不那么有趣,只是颜色“看起来”相似。
为了记录,我试图做的是将某人的衣服与纹理文件相匹配,如果这有什么不同的话。
任何关于某些资源方向的建议或观点将不胜感激。
编辑:我的解决方案是从我选择的集合中删除灰色,并且效果很好,如果其他人有任何更好的解决方案,请随时发布。
解决方案
我昨天刚刚发布了这个,我不想重复这个帖子,但它非常相似。
我的开源项目 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
也许这会给你一些想法。
推荐阅读
- verilog - 如何修复错误:“[”附近:语法错误,意外的“[”?
- java - 如何将 JFilechooser 设置为具有 Windows 外观和感觉?我只希望 JFilechooser 具有 Windows 外观,但别无其他
- python - Tensorflow:无效参数:断言失败:[`predictions`包含负值]
- excel - 使用公式增加单元格中的某个值
- php - 将数组值从父级复制到子级
- javascript - 设置了多个 Access-Control-Allow-Origin 标头
- visualvm - OpenLiberty - VisualVM
- python - 如何以特定方式交换列表中的项目?
- assembly - 如何访问整数数组的元素
- database - 在 mongoDB 中实现 FIFO 集合的最佳方法是什么?