图像比较和返回百分比

时间:2011-07-06 14:28:13

标签: c# image-processing bitmap comparison

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张图像的forex像素,是的,它可以返回差异的百分比,所以它将第一张图像的每个像素与第二张图像的相同索引中的像素进行比较。但这里有什么问题,我有一个巨大的精度可能它不应该像那样,比较,也许有一些更好,更灵活的更好的算法。 所以任何人都有一个想法,我如何改变比较,如果我继续这个或我应该比较每个像素的颜色或....

PS:如果有人有解决方案如何制作并行代码,我也会接受它!就像将它扩展到4个线程一样,它们会在四核中更快地完成吗?

2 个答案:

答案 0 :(得分:7)

一个明显的变化是每GetPixel只调用Bitmap一次,然后直接使用返回的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);
        }
    }
}

答案 1 :(得分:6)

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