c# - 图像比较和返回百分比

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

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);
        }
    }
}

关于c# - 图像比较和返回百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6598048/

相关文章:

c++ - 自定义按钮形状

c# - WPF DataGrid 绑定(bind) DataGridCell 内容

c# - 自定义 Entity Framework 核心迁移脚本?

c# - 在通过网络发送之前压缩位图

android - view.getDrawingCache() 只工作一次

image - 在Matlab中将彩色像素添加到灰度图像

c# - 有没有办法用 NLog 创建命名记录器并按此名称过滤日志记录?

c# - 使用 getter/setter 类属性时 msbuild 编译失败

image - Matlab - 根据regionprops过滤标记矩阵

image - 两幅图像的互信息和联合熵-MATLAB