图像比较和返回百分比

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

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

一个明显的变化是每个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); } } } 

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