我正在用C#编写一个工具来查找重复的图像。目前,我创建一个文件的MD5校验和,并比较这些文件。
不幸的是,这些图像可以是:
解决这个问题最好的办法是什么?
发布于 2016-02-02 12:44:44
下面是一种使用256位图像哈希(MD5有128位)的简单方法。
List<bool>
--这是哈希码
public static List<bool> GetHash(Bitmap bmpSource)
{
List<bool> lResult = new List<bool>();
//create new image with 16x16 pixel
Bitmap bmpMin = new Bitmap(bmpSource, new Size(16, 16));
for (int j = 0; j < bmpMin.Height; j++)
{
for (int i = 0; i < bmpMin.Width; i++)
{
//reduce colors to true / false
lResult.Add(bmpMin.GetPixel(i, j).GetBrightness() < 0.5f);
}
}
return lResult;
}
我知道,GetPixel
不是那么快,但是在16x16像素的图像上,它不应该成为瓶颈。
代码:
List<bool> iHash1 = GetHash(new Bitmap(@"C:\mykoala1.jpg"));
List<bool> iHash2 = GetHash(new Bitmap(@"C:\mykoala2.jpg"));
//determine the number of equal pixel (x of 256)
int equalElements = iHash1.Zip(iHash2, (i, j) => i == j).Count(eq => eq);
因此,此代码能够找到与以下内容相同的图像:
i
和j
的迭代顺序更新/改进:
使用此方法一段时间后,我注意到了一些可以改进的地方。
发布于 2016-02-20 06:15:52
您可以检查比较两幅图像的算法,以查看可用的图像比较方法。
除非您想自己重新创建完整的算法,否则应该尝试使用已经存在的库或至少一部分代码(只要它们的许可对您来说是可以的)。
对于边缘检测和相关计算机视觉算法的开源C#实现,您可以尝试EmguCV,它是OpenCV的包装器。
发布于 2016-02-19 20:40:37
在将图像重采样到某种常见分辨率之后,您可以使用小波分解并比较这种分解的系数,而不是图像本身。只对第一个N个系数进行比较,将使该方法对噪声和其他伪影具有更强的鲁棒性。
有几种用于小波的C#实现。一个例子是https://waveletstudio.codeplex.com/
https://stackoverflow.com/questions/35151067
复制相似问题