【问题标题】:Image Comparing and return Percentage图像比较和返回百分比
【发布时间】:2011-09-29 16:40:53
【问题描述】:
int DiferentPixels = 0;
Bitmap first = new Bitmap("First.jpg");
Bitmap second = new Bitmap("Second.jpg");
Bitmap container = new Bitmap(first.Width, first.Height);
for (int i = 0; i < first.Width; i++)
{
    for (int j = 0; j < first.Height; j++)
    {
    int r1 = second.GetPixel(i, j).R;
    int g1 = second.GetPixel(i, j).G;
    int b1 = second.GetPixel(i, j).B;

    int r2 = first.GetPixel(i, j).R;
    int g2 = first.GetPixel(i, j).G;
    int b2 = first.GetPixel(i, j).B;

    if (r1 != r2 && g1 != g2 && b1 != b2)
    {
    DiferentPixels++;
    container.SetPixel(i, j, Color.Red);
    }
    else
    container.SetPixel(i, j, first.GetPixel(i, j));
    }
}
int TotalPixels = first.Width * first.Height;
float dierence = (float)((float)DiferentPixels / (float)TotalPixels);
float percentage = dierence * 100;

使用这部分代码,我比较了每个像素的 2 个图像,是的,它可以返回差异百分比,因此它将第一个图像的每个像素与第二个图像的相同索引中的像素进行比较。但是这里有什么问题,我有一个巨大的精度也许它不应该那样工作,比较,也许有一些更好的算法更快,更灵活。 因此,任何人都知道如何转换比较,我应该继续进行还是应该比较每个像素的颜色或 ....

PS:如果有人有如何制作 Parallel 这个代码的解决方案,我也会接受它!就像将其扩展到 4 线程一样,他们会在四核中做得更快吗?

【问题讨论】:

  • 图片有多大?除非它们非常大或者你有很多,否则并行化代码可能不值得。
  • @Matt 图像大小不是问题,但情况是它会连续比较很多图像,比如 100 个!这让我很困扰。
  • 这似乎是并行化代码的好候选
  • @Matt 任何建议从哪里开始,因为我真的需要调整它
  • 谁投了反对票,我真的很想知道为什么?因为更好的想法是我在等待的=)有勇气告诉我为什么投了反对票!

标签: c# image-processing bitmap comparison


【解决方案1】:

一个明显的变化是每个Bitmap 只调用一次GetPixel,然后直接使用返回的Color 结构:

for (int i = 0; i < first.Width; ++i)
{
    for (int j = 0; j < first.Height; ++j)
    {
        Color secondColor = second.GetPixel(i, j);
        Color firstColor = first.GetPixel(i, j);

        if (firstColor != secondColor)
        {
            DiferentPixels++;
            container.SetPixel(i, j, Color.Red);
        }
        else
        {
            container.SetPixel(i, j, firstColor);
        }
    }
}

【讨论】:

  • 这会节省内存和 CPU 还是只节省其中之一?
  • @Cody 主要是 CPU。它确实使它不会在每个循环中产生 6 个整数,但它们的寿命很短并且在堆栈上,因此内存部分并不重要。
【解决方案2】:

为了提高速度,请将图像调整为非常小的尺寸(例如 16x12)并进行像素比较。如果它是近似匹配,然后尝试更高分辨率。

【讨论】:

  • 好主意,我会尝试一下,但很抱歉我不能接受,因为我期待更多答案,我认为我的问题需要更多类似的建议,再次感谢
猜你喜欢
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 2015-12-29
相关资源
最近更新 更多