我怎样才能准确分辨出两幅图像之间的变化?


28

例如,对于最近有关JPEG压缩的讨论,我想逐个像素比较两个JPEG之间的变化(一个压缩级别为100,另一个压缩级别为95)。

如何在没有繁琐的自定义软件编程的情况下生成关于更改内容的良好视觉地图?


2
不要将其作为答案提交,因为它可能不是照片的可行解决方案,但是GitHub(程序员站点)提供了一些比较图像的有趣方法:github.com/cameronmcefee/Image-Diff-View-Modes/commit/…尝试单击“ 2-up”,“滑动”,“洋葱皮”和“差异”。
亨里克·N

Answers:


35

Photoshop +图层FTW。(是的,您也可以使用Gimp或其他具有相同功能的编辑软件。)

从您的基本图像开始,在上述情况下,我使用了jpeg质量100图像。

  1. 在它上面创建一个新层
  2. 将第二张图片粘贴到该图层中
  3. 将图层样式设置为“差异”(请参见下面的第一个图像中的左粉红色箭头)
  4. 在该图层上创建一个效果层(“图层”>“新调整层”>“阈值”)
  5. 将效果设置为阈值(请参见下面的第一个图像中的右粉红色箭头)
  6. 将阈值设置为1

在生成的图像中,两个图像之间有任何差异的任何像素都是白色。您可以通过更改阈值来对其进行调整,以使情况有所不同。

该示例显示了Lightroom中jpeg 92和100之间的很多差异。 将LR中的jpeg 92和100与Photoshop图层进行比较

该示例显示95和100之间完全没有差异。 将LR中的jpeg 95和100与Photoshop图层进行比较

这不只是显示二进制“已更改或未更改”,如果您想更详细地了解更改的数量,例如按颜色通道,该怎么办?

  1. 将阈值调整层替换为曲线调整层。
  2. 编辑曲线
  3. 打开节目剪辑
  4. 抓住右下角下方的输入白色手柄并将其拖动到左侧,直到可以
  5. 慢慢地向右移动,直到看不到任何剪裁(预览图像全为黑色)
  6. 重新关闭剪辑并保存曲线更改

生成的像素越亮,它们在该颜色中的差异就越大。不利的一面是,最终您会遇到很多泥泞的泥潭……因此有时将其阈值以查看差异在哪里会更容易。这就是为什么我同时构建两者并切换可见的原因。

对差异的更具描述性的看法


Newb问题,但是您如何执行第4步,“在其上创建效果层”?在任何地方都找不到。也是7年后,我可能正在使用最新版本,因为他们可能也更改了名称?
惠特尼乐园'18

14

如果您使用Photoshop,请按以下步骤操作:

将两个jpeg放在同一psd文件中的两个单独的层中。它们应该完全重叠,因为它们的尺寸相同。(最重要的是哪一个)。

将图层混合模式设置为“差异”。您会看到几乎是黑色的结果。取决于两个原始图层之间的质量差异,您可能会看到或多或少的噪音。

在此处输入图片说明


当您留下像这样的大黑洞时,仅靠差异并没有多大帮助。:)
cabbey 2011年

@cabbey当然,比较100%到95%,您很可能会得到纯黑色。但这就是您的问题是不是?在所有者答案中,您正在更改要比较的原始文件的值,这使它们不再具有原始压缩设置。

在几乎所有比较中,您都会得到几乎纯黑色,因为差异很小。差异之后的阈值/曲线层对压缩设置没有任何作用,它只是有助于可视化差异准备好的黑汤的下限。(我不是100%知道您的意思,所以我可能会朝着另一个方向前进。。。)
cabbey 2011年

@cabbey如果您要对两张图像之间的差异进行纯逐位运算,则仅“ Difference”混合模式即可为您提供。调整阈值/曲线时,虽然用肉眼可以看到明显的结果,但它不能准确表示更改的内容。什么时候做,您不再将100%和95%进行比较。

当然可以。压缩级别不再重要,因为第二个photoshop将磁盘上的图像加载到其内部缓冲区中,现在它是内存中未压缩的像素阵列...如果这些像素到达那里是因为图像在那里存在正方形斑点或因为它们是伪像压缩级别的大小无关。
cabbey 2011年

13

所有图像处理软件包都应使此操作变得容易。如果您可以使用该系统,我将向您展示如何在Mathematica中进行操作。Mathematica是一种编程语言,但是进行此类操作真的很容易,因此,如果您可以使用它(例如,通过大学站点许可证),我建议您试试!

首先,导入图像:

img = Import["http://farm1.staticflickr.com/62/171463865_36ee36f70e.jpg"]

使用JPEG压缩重新压缩

img2 = ImportString@ExportString[img, "JPEG", "CompressionLevel" -> 0.35]

Mathematica图形

现在处理像素值的差异,首先将它们转换为浮点数,以确保保留负值。

diff = ImageSubtract[Image[img, "Real"], Image[img2, "Real"]]

Mathematica图形

差异图像上看不到太多(差异很小),并且负值被裁剪为黑色。因此,让我们重新缩放所有值以填充整个动态范围(最小值将缩放为0,最大值将缩放为1):

ImageAdjust[diff]

Mathematica图形

ImageDifference给出两个图像的绝对差,并且不产生负数。这是您更可能在图像处理程序包中找到的操作,尤其是在GUI处理程序包(Photoshop,GIMP)中。

ImageDifference[img, img2]

Mathematica图形

我们还可以采用单个RGB通道(例如红色通道),并使用“相反”的颜色可视化正负差异:

ArrayPlot[0.5 + ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Mathematica图形

这是同一件事,差异扩大了5倍。JPEG伪像现在更加可识别。

ArrayPlot[0.5 + 5 ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Mathematica图形

使用编程语言的优点是,我们可以轻松地自动执行此操作,并查看差异在0.1和1.0之间的“压缩级别”如何变化:

Grid@Partition[Table[
   ArrayPlot[
    0.5 + ImageData[
      First@ColorSeparate[
        ImageSubtract[Image[img, "Real"], 
         Image[ImportString@
           ExportString[img, "JPEG", "CompressionLevel" -> c], 
          "Real"]], "Red"]], ColorFunction -> "RedGreenSplit", 
    ColorFunctionScaling -> False],
   {c, 0.1, 1, 0.1}
   ], 5]

Mathematica图形


看到脚本化/自动化的选项总是很高兴!:)
jrista

5

您可以使用Imagemagick命令行工具。

composite imagesrc1.jpg imagesrc2.jpg -compose difference diffs.jpg

将为每个RGB通道提供差异的绝对值。



0
  1. 在GIMP或Photoshop中打开其中一张图像。
  2. 将第二个图像添加为第一个图像之上的新层。
  3. 将顶层的混合模式设置为“差异”

在生成的图像中,黑色部分表示原始图像相同,而较浅的部分则表示差异。


当您留下像这样的大黑洞时,仅靠差异并没有多大帮助。:)
cabbey 2011年

您始终可以调整结果图像上的色阶。每当我使用这种技术时,我的图片就会有足够的差异,以至于可以看到变化:)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.