例如,对于最近有关JPEG压缩的讨论,我想逐个像素比较两个JPEG之间的变化(一个压缩级别为100,另一个压缩级别为95)。
如何在没有繁琐的自定义软件编程的情况下生成关于更改内容的良好视觉地图?
例如,对于最近有关JPEG压缩的讨论,我想逐个像素比较两个JPEG之间的变化(一个压缩级别为100,另一个压缩级别为95)。
如何在没有繁琐的自定义软件编程的情况下生成关于更改内容的良好视觉地图?
Answers:
Photoshop +图层FTW。(是的,您也可以使用Gimp或其他具有相同功能的编辑软件。)
从您的基本图像开始,在上述情况下,我使用了jpeg质量100图像。
在生成的图像中,两个图像之间有任何差异的任何像素都是白色。您可以通过更改阈值来对其进行调整,以使情况有所不同。
该示例显示了Lightroom中jpeg 92和100之间的很多差异。
该示例显示95和100之间完全没有差异。
这不只是显示二进制“已更改或未更改”,如果您想更详细地了解更改的数量,例如按颜色通道,该怎么办?
生成的像素越亮,它们在该颜色中的差异就越大。不利的一面是,最终您会遇到很多泥泞的泥潭……因此有时将其阈值以查看差异在哪里会更容易。这就是为什么我同时构建两者并切换可见的原因。
如果您使用Photoshop,请按以下步骤操作:
将两个jpeg放在同一psd文件中的两个单独的层中。它们应该完全重叠,因为它们的尺寸相同。(最重要的是哪一个)。
将图层混合模式设置为“差异”。您会看到几乎是黑色的结果。取决于两个原始图层之间的质量差异,您可能会看到或多或少的噪音。
所有图像处理软件包都应使此操作变得容易。如果您可以使用该系统,我将向您展示如何在Mathematica中进行操作。Mathematica是一种编程语言,但是进行此类操作真的很容易,因此,如果您可以使用它(例如,通过大学站点许可证),我建议您试试!
首先,导入图像:
img = Import["http://farm1.staticflickr.com/62/171463865_36ee36f70e.jpg"]
使用JPEG压缩重新压缩
img2 = ImportString@ExportString[img, "JPEG", "CompressionLevel" -> 0.35]
现在处理像素值的差异,首先将它们转换为浮点数,以确保保留负值。
diff = ImageSubtract[Image[img, "Real"], Image[img2, "Real"]]
差异图像上看不到太多(差异很小),并且负值被裁剪为黑色。因此,让我们重新缩放所有值以填充整个动态范围(最小值将缩放为0,最大值将缩放为1):
ImageAdjust[diff]
ImageDifference
给出两个图像的绝对差,并且不产生负数。这是您更可能在图像处理程序包中找到的操作,尤其是在GUI处理程序包(Photoshop,GIMP)中。
ImageDifference[img, img2]
我们还可以采用单个RGB通道(例如红色通道),并使用“相反”的颜色可视化正负差异:
ArrayPlot[0.5 + ImageData[First@ColorSeparate[diff, "Red"]],
ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]
这是同一件事,差异扩大了5倍。JPEG伪像现在更加可识别。
ArrayPlot[0.5 + 5 ImageData[First@ColorSeparate[diff, "Red"]],
ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]
使用编程语言的优点是,我们可以轻松地自动执行此操作,并查看差异在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]
GitHub在网络上内置了一些有趣的图像差异工具,如此处所述并在本演示中进行了演示。
在生成的图像中,黑色部分表示原始图像相同,而较浅的部分则表示差异。