C#检查图像是否相等

时间:2019-03-20 17:09:53

标签: c#

我有此代码,用于从热像仪发送图像。 getImage()返回相机提供的实际图像。不可能直接检查相机是否可以提供“新”图像,所以我使用此方法比较了两个图像:

class ImageCompare
    {
        public enum CompareResult
        {
            CompareOK,
            SizeMismatch,
            PixelMismatch
        };

        public static CompareResult CompareImages(Image i1, Image i2)
        {
            CompareResult cr = CompareResult.CompareOK;

            if (i1.Size != i2.Size)
            {
                cr = CompareResult.SizeMismatch;
            }
            else
            {
                ImageConverter ic = new ImageConverter();
                byte[] btImage1 = new byte[1];
                btImage1 = (byte[])ic.ConvertTo(i1, btImage1.GetType());
                byte[] btImage2 = new byte[1];
                btImage2 = (byte[])ic.ConvertTo(i2, btImage2.GetType());

                //compute hashes
                SHA256Managed shaM = new SHA256Managed();
                byte[] hash1 = shaM.ComputeHash(btImage1);
                byte[] hash2 = shaM.ComputeHash(btImage2);

                for (int i = 0; i < hash1.Length && i < hash2.Length
                                  && cr == CompareResult.CompareOK; i++)
                {
                    if (hash1[i] != hash2[i])
                        cr = CompareResult.PixelMismatch;
                }
            }
            return cr;
        }
    }

这是我使用此类的方法:

private static void HandleImageSending(Socket client, Socket s)
        {
            int sent;
            int imageCount = 0;
            long totalSize = 0;
            try
            {
                while (true)
                {
                    Console.WriteLine("Starting sending...");
                    Image old = getImage();
                    byte[] bmpBytes;
                    using (Image bmp = getImage())
                    using (MemoryStream ms = new MemoryStream())
                    {
                        if (ImageCompare.CompareImages(bmp, old) == ImageCompare.CompareResult.CompareOK)
                        {
                            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                            bmpBytes = ms.ToArray();
                            sent = SendVarData(client, bmpBytes);
                            imageCount++;
                            totalSize += sent;
                            old = bmp;
                        }
                    }
                }
            }
            catch (Exception e)
            { ... }

所以我的问题是按哈希比较 20个案例中约有19个出现“不同”图像。由于相机只能提供8 fps,因此一定有问题。

是否存在与某种容忍度进行比较的可能性,所以也许可以说,比较的新图像的5%或10%可能与旧图像有所不同?

由于这是在微型PC上使用的,我希望使用尽可能少的CPU负载。
有谁可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

索引图像(并减小尺寸)应该为相似图像提供相同的结果

使用

Bitmap imgtarget = imgsource.Clone(
    new Rectangle(0, 0, imgsource.Width, imgsource.Height),
    PixelFormat.Format8bppIndexed);

来自another stackoverflow