gpt4 book ai didi

c# - 我们可以以编程方式比较具有相同分辨率的不同图像吗?

转载 作者:IT老高 更新时间:2023-10-28 22:08:15 31 4
gpt4 key购买 nike

有没有一种比较可靠的方法来比较相同格式和相同分辨率的图像并获得它们之间的差异?

在最佳情况下,我正在寻找可以比较的图像数值表示形式,因为我必须比较许多图像。

最佳答案

您可以使用ImageMagick的compare命令执行此操作。

(如果您成功使用了命令行,则可以继续使用ImageMagick的API之一:这些API尤其适用于C('MagickWand'),C++('Magick++'),Java('JMagick') ,LISP('L-Magick'),.NET('Magick.NET'),Perl('PerlMagick'),PHP('IMagick'),Python('PythonMagick')和Ruby('RMagick')。-然后在您自己的应用程序中实现相应的功能。)

唯一的要求是:图像需要在宽度和高度上具有相同的尺寸(以像素数衡量)。因此,您甚至不需要与您假设的相同的格式

差异可以通过不同的方式返回:

  • 生成差异的直观表示,其中带有增量的像素以某种方式在增量图像中突出显示。
  • 生成差异的文本和/或统计表示,其中输出是一个或多个数字,或仅是不同像素的计数或其他度量。


  • 例子

    这是可以比较的四个示例图像。它们的外观相似,尺寸为322x429像素-但是在颜色和格式方面存在一些细微的区别:右上角是JPEG,其他三个是PNG:



    视觉比较

    这是比较最上面的两个图像并产生视觉“增量”的最简单命令:
    compare                              \
    http://i.stack.imgur.com/GBax7.png \
    http://i.stack.imgur.com/D9IAV.jpg \
    delta1.pdf

    这会将PNG与JPEG进行比较,并生成PDF作为输出。对于此输出的视觉印象,请参见下面的左图(由于此处无法显示PDF,因此我确实制作了PNG并将其用于显示)。

    所有ImageMagick compare命令中最简单的命令到底做了什么?
  • 它使用第一张图像作为浅色背景。
  • 它在每个位置上覆盖了完全不透明的红色像素,第二个图像中各个像素的颜色与第一个图像偏离。

  • (如果我不想使用默认的红色突出显示,我可以添加 -highlight-color blue-lowlight-color yellow或任何其他颜色定义)

    如果我不想对像素颜色进行如此精确的比较怎么办?如果仅当各个像素之间的色彩距离更大时才希望红色像素怎么办?

    简单:在命令行中添加一个“模糊”因素!
    compare                              \
    http://i.stack.imgur.com/GBax7.png \
    http://i.stack.imgur.com/D9IAV.jpg \
    -fuzz 2.5% \
    delta2.png

    当第一个(最简单的)比较命令在没有附加参数的情况下运行时,ImageMagick静默添加了其默认比较方法的规范,该规范称为 -compose src-over

    当然,我们可以覆盖它并使用其他合成模式。如何了解可用的构图模式?命令 convert -list compose将为我们枚举它们!这是完整的列表-它在我的系统上包含67个不同的列表:

    Atop Blend Blur Bumpmap ChangeMask Clear ColorBurn ColorDodge Colorize CopyBlack CopyBlue CopyCyan CopyGreen Copy CopyMagenta CopyOpacity CopyRed CopyYellow Darken DarkenIntensity DivideDst DivideSrc Dst Difference Displace Dissolve Distort DstAtop DstIn DstOut DstOver Exclusion HardLight HardMix Hue In Lighten LightenIntensity LinearBurn LinearDodge LinearLight Luminize Mathematics MinusDst MinusSrc Modulate ModulusAdd ModulusSubtract Multiply None Out Overlay Over PegtopLight PinLight Plus Replace Saturate Screen SoftLight Src SrcAtop SrcIn SrcOut SrcOver VividLight Xor



    让我们尝试每一个:
    for i in $(convert -list compose|tr "\n" " "); do \
    compare \
    http://i.stack.imgur.com/GBax7.png \
    http://i.stack.imgur.com/D9IAV.jpg \
    -compose ${i} \
    delta-${i}.png ; \
    done

    当然,现在要显示每个生成的增量图像将太过分了。最有趣的是:
  • 左上方是-compose Difference
  • 右上方是-compose DivideSrc
  • 左中心是-compose CopyBlue
  • 中心右边是-compose MinusDst
  • 左下方是-compose Hue
  • 右下角是-compose LightenIntensity

  • 注意:如果交换两个比较图像的顺序,则两个结果增量可能是两个明显不同的结果!



    现在,您已经可以通过视觉比较两个相似的图像来开始自己的实验。

    度量结果

    要生成有关两个图像的差异的度量,可以运行如下命令:
    compare                               \
    -metric rmse \
    http://i.stack.imgur.com/GBax7.png \
    http://i.stack.imgur.com/D9IAV.jpg \
    null:
    rmse是均方根误差的首字母缩写。以上示例图像的结果为:
     1339.53 (0.02044)

    支持多少种不同的度量方法?

    对于当前版本的ImageMagick,以下命令列举给定系统上所有可用的比较指标方法:
    compare -list metric 

    在我的笔记本上,这些是:

    AE Fuzz MAE MEPP MSE NCC PAE PHASH PSNR RMSE



    这些缩写的含义是:
    AE     absolute error count, number of different pixels (`-fuzz` effected)
    FUZZ mean color distance
    MAE mean absolute error (normalized), average channel error distance
    MEPP mean error per pixel (normalized mean error, normalized peak error)
    MSE mean error squared, average of the channel error squared
    NCC normalized cross correlation
    PAE peak absolute (normalized peak absolute)
    PHASH perceptual hash
    PSNR peak signal to noise ratio
    RMSE root mean squared (normalized root mean squared)

    有趣的(相对较新的)度量标准是 phash(“感知哈希”)。它是唯一一张不需要两个比较图像相同尺寸的图像。最好是在命令行和程序上缩小看起来相似的图像(或至少可靠地排除看起来非常不同的这些图像对)而不真正“看它们”的最佳“度量”。

    要运行的一个很好的实验是将图像与其自身进行比较。它显示了各个指标如何将“身份”转换为自己的环境:
    for i in $(compare -list metric); do     \
    compare \
    -metric $i \
    http://i.stack.imgur.com/GBax7.png \
    http://i.stack.imgur.com/GBax7.png \
    null: \
    done

    结果如下:
    AE    :   0
    Fuzz : 0 (0)
    MAE : 0 (0)
    MEPP : 0 (0, 0)
    MSE : 0 (0)
    NCC : 1.00001
    PAE : 0 (0)
    PHASH : 0
    PSNR : inf
    RMSE : 0 (0)

    如您所见,每个度量标准方法都返回 0,除了两个:PSNR返回 infinity,而NCC返回 1.00001

    运行相同的命令,并将100x100像素的纯白色补丁与纯黑色的补丁进行比较:
    for i in $(compare -list metric); do \
    compare \
    -metric $i \
    -size 100x100 \
    xc:white \
    xc:black \
    null: \
    done

    这将返回以下结果:
    AE    :   10000
    Fuzz : 65535 (1)
    MAE : 65535 (1)
    MEPP : 1.96605e+09 (1.00003, 1)
    MSE : 65535 (1)
    NCC : 0
    PAE : 65535 (1)
    PHASH : 417.941
    PSNR : 0
    RMSE : 65535 (1)
    AE指标符合预期:10000个像素(来自 -size 100x100)不同。一旦您 read up and grokked各自的度量标准定义意味着什么,大多数其他结果也将易于理解。

    最后,在比较上方的前两张图片(PNG和JPEG)时,让我们看一下每个可用指标的输出:
    for i in $(compare -list metric); do     \
    compare -metric $i \
    http://i.stack.imgur.com/GBax7.png \
    http://i.stack.imgur.com/D9IAV.jpg \
    null: \
    done

    AE : 74200
    Fuzz : 1339.53 (0.02044)
    MAE : 499.997 (0.00762946)
    MEPP : 2.07206e+08 (0.000417654, 0.435294)
    MSE : 27.3801 (0.000417793)
    NCC : 0.99709
    PAE : 28527 (0.435294)
    PHASH : 0.745389
    PSNR : 33.7904
    RMSE : 1339.53 (0.02044)

    现在选择您的指标! :-)

    关于c# - 我们可以以编程方式比较具有相同分辨率的不同图像吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27974945/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com