<返回更多

如何通过 C# 比较两幅图片的相似度?

2023-09-28  微信公众号  一线码农聊技术
加入收藏

咨询区

我在用 C# 实现一个可以查找重复图片的小工具,我目前是给每一个图片做一个 md5 码,然后通过 md5 值来判断图片是否相同。

但现实情况要复杂的多,比如:

  1. 图片被旋转了,比如:90°

  2. 图片大小不一致

  3. 不同的压缩比例和后缀名

请问是否有更好的方式来解决?

回答区

这种比较图片是否相同的解决思路,可以大概总结为下面四步。

  1. 调整图片大小为 16x16 像素
  1. 调整图片为 黑白 色,这样就可以用 1/0 来表示。
  1. 将行列的黑白点 读取到 List 中,参考如下代码:
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 方法性能不是很高,但在 16*16 像素场景下应该不会有性能问题。

  1. 比较两幅图片所生成的 List,然后再设置一个容忍值即可,参考如下代码:
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);

图片比较算法本质上来说是非常复杂的,除非你的场景一定要实现一个原创的相似度比较算法,否则我建议你使用一些市场上已存在的开源库,比如说:EmguCV,它是一个开源的C#实现的边缘检测和相关的计算机视觉算法,包装了用 C 和 C++ 实现 的 OpenCV 上。

关键词:C#      点击(1)
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多C#相关>>>