【问题标题】:Comparing Images with variation in transparency level and comparing texts in it比较具有透明度级别变化的图像并比较其中的文本
【发布时间】:2015-06-26 13:01:25
【问题描述】:

我有多个由不同软件在多个文件夹中生成的标签。标签的大小相同,但它们的透明度标签不同。理想情况下它们是相同的,但是当我使用我的内部应用程序进行比较时,它会抛出错误,说它们不匹配。

我知道有人问过类似的问题,但它们与我的问题并不完全匹配。我需要用c#实现相关算法。

我正在探索一些 API AForge.Net、ImageMagick。

到目前为止,我已经比较了字节数

filename1 = Path.Combine(directory.ToString(), new1[i].ToString());
filename2 = Path.Combine(directory1.ToString(), new2[i].ToString());

using (Bitmap bm1 = new Bitmap(filename1))
{
    using (Bitmap bm2 = new Bitmap(filename2))
    {
        // Make a difference image.
        int wid = Math.Min(bm1.Width, bm2.Width);
        int hgt = Math.Min(bm1.Height, bm2.Height);
        Bitmap bm3 = new Bitmap(wid, hgt);

        // Create the difference image.
        bool are_identical = true;
        Color eq_color = Color.White;
        Color ne_color = Color.Red;
        for (int x = 0; x < wid; x++)
        {
            for (int y = 0; y < hgt; y++)
            {
                //if (bm1.GetPixel(x, y).Equals(bm2.GetPixel(x, y)))
                if (bm1.GetPixel(x, y) != (bm2.GetPixel(x, y)))
                {
                    //bm3.SetPixel(x, y, eq_color);
                    bm3.SetPixel(x, y, ne_color);
                    are_identical = false;

                }
                else
                {
                    //bm3.SetPixel(x, y, ne_color);
                    //are_identical = false;

                }
            }
            //I kept the code here before
        }
        if (!are_identical)
        {
            bm3.Save(@"C:\Users\XPS Files\DiffrenceofImages" + new1[i]);
        }
        // Display the result.
        //picResult.Image = bm3;
        //bm3.Save(@"C:\Users\XPS Files\DiffrenceofImages\" + new1[i]);
        this.Cursor = Cursors.Default;
        if ((bm1.Width != bm2.Width) || (bm1.Height != bm2.Height)) are_identical = false;
        if (are_identical)
        {
            //richTextBox1.Text = string.Format("Images are identical", "\r\n");
            sb.AppendLine("Image Name=" + new1[i] + " are identical at both folder");
        }
        else
        {
            //richTextBox1.Text = string.Format("Images are NOT MATCHING", "\r\n");
            sb.AppendLine("Image Name=" + new1[i] + " are Not Matching at both folder");
        }

        //sb.AppendLine(f1.Name + ": " + (equal ? "Images are equal" : "Images are NOT equal"));

    }
}
result.Add(sb.ToString());

【问题讨论】:

  • 您的代码似乎有问题。但是,除非我们有code or information that can reproduce the problem,否则我们无能为力。否则,我们只是在盲目猜测。
  • 请提供一些您已经做过的代码和失败的代码。在我看来,您只需忽略 Alpha 通道,但这只是第一个想法。
  • 为什么是负面的?我的 emgucv 代码 Image bitmap = new Image(@"D:\red3.bmp"); Image bitmap1 = new Image(@"D:\red3.bmp"); Hsv lowerLimit = new Hsv(0, 0, 200); Hsv 上限 = 新 Hsv(5, 255, 255); var imageHSVDest = bitmap.InRange(lowerLimit, upperLimit); CvInvoke.cvShowImage("imageHSVDest", imageHSVDest); bitmap.AbsDiff(bitmap1);

标签: c# image-comparison


【解决方案1】:

我不确定您是否想使用 ImageMagick。如果这样做,您可以使用 +matte-alpha off 禁用 alpha/透明通道。

所以,如果我创建两个红色图像,其中一个具有径向渐变的透明度,如下所示:

convert -size 500x500 xc:red \( radial-gradient:black-gray90 -sigmoidal-contrast 10,50% \) -compose copy-opacity -composite radial.png

还有一个带有直渐变的透明度,如下所示:

convert -size 500x500 xc:blue \( gradient:white-gray40 \) -compose copy-opacity -composite straight.png

然后我可以使用 ImageMagick 比较它们,但忽略透明度的差异,如下所示:

convert radial.png straight.png +matte -metric AE -compare format "Count of differing pixels:%[distortion]" info:
Count of differing pixels:0

该命令说... radial.pngstraight.png 加载到图像堆栈中并从两者中删除透明度,然后计算并报告不同像素的总数 - 因为透明度已经为零,所以删除。

【讨论】:

  • 抱歉回复晚了,为什么我仍然面临问题。我在不同的文件夹中有同名的图像,我需要比较它们。它们是黑白图像。 (具体如此链接所示,例如info.pcforms.com/DIY-Printing-blog/bid/26211/…)由于构建问题,虽然图像包含相同,但两个图像之间的一些时间间隔和字体大小不同。我的客户对结果不满意(显示不同),因为肉眼看起来都一样。这个问题我想在这里解决。我尝试了 OCR,但显示差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 2013-12-17
相关资源
最近更新 更多