ens*_*are 6 python imagemagick imagemagick-identify
鉴于两张图片:
image1.jpg
image2.jpg
Run Code Online (Sandbox Code Playgroud)
什么是快速检测它们在Python中是否在视觉上相同的方法?例如,它们可能具有不同的EXIF数据,即使图像数据相同,也会产生不同的校验和.
Imagemagick有一个很好的工具,"识别",可以产生图像的视觉散列,但它是处理器密集型的.
我仍在提交我的方法来解决这个问题——即使 OP 说 ImageMagick 的方式过于处理器密集型(即使我的方式不涉及 Python)......也许我的回答对其他人有用,到达此页面通过搜索引擎。
请注意,任何旨在发现高分辨率图像中细微差异的图像比较比发现低分辨率图像中的大差异更需要处理器密集型,因为它必须比较更多像素。
这是一个 ImageMagick 命令,它比较两个(相同大小!)图像,并将所有不同的像素返回为红色,将相同的像素返回为白色。第一个将参考图像作为淡出的背景图像,用于组成红白像素矩阵。.img可以是任何 IM 支持的格式(.png、.PNG、.pNG、.PNG、.jpg、.jpeg、.jPeG、.tif、.tiff、.ppm、.gif、.pdf、...) :
compare reference.img similar.img delta.img
compare reference.img similar.img -compose src delta.img
Run Code Online (Sandbox Code Playgroud)
默认情况下,以 72 PPI 进行比较。如果您需要更高的分辨率(例如,基于矢量的图像,例如 PDF 页面),您可以添加-density以增加它。当然,处理时间也会相应增加:
compare -density 300 reference.img similar.img delta.img
Run Code Online (Sandbox Code Playgroud)
如果添加fuzz factor,则可以告诉 ImageMagick 将所有像素视为相同,并且相距不超过特定颜色距离:
compare -fuzz '3%' reference.img similar.img -compose src delta.img
Run Code Online (Sandbox Code Playgroud)
更新版本的 ImageMagick 支持该phash算法:
compare -metric phash reference.img similar.img -compose src delta.img
Run Code Online (Sandbox Code Playgroud)
除了创建delta.img可视化之外,这还将返回一个数值,指示两个图像之间的“差异”。越接近0,则比较的两个图像越相似。
创建一些小的 PDF 页面,它们之间的差异很小。我正在使用 Ghostscript:
gs -o ref1.pdf -sDEVICE=pdfwrite -g1050x1350 \
-c "/Courier findfont 160 scalefont setfont 10.0 10.0 moveto (0) show showpage"
gs -o ref2.pdf -sDEVICE=pdfwrite -g1050x1350
-c "/Courier findfont 160 scalefont setfont 10.1 10.1 moveto (0) show showpage"
gs -o ref3.pdf -sDEVICE=pdfwrite -g1050x1350 \
-c "/Courier findfont 160 scalefont setfont 10.0 10.0 moveto (O) show showpage"
gs -o ref4.pdf -sDEVICE=pdfwrite -g1050x1350 \
-c "/Courier findfont 160 scalefont setfont 10.1 10.1 moveto (O) show showpage"
Run Code Online (Sandbox Code Playgroud)
现在ref1.pdf与ref3.pdf默认分辨率 72 PPI 进行比较:
compare -metric phash ref1.pdf ref3.pdf delta-ref1-ref3.pdf
7.61662
Run Code Online (Sandbox Code Playgroud)
返回的 pHash 值为7.61662。这表明 ImageMagickcompare至少发现了一些差异。
让我们看一下可视化。我将创建三个 PDF/图像的并排可视化(如下所示):
convert \
-mattecolor blue \
\( ref1.pdf -frame 2x2 \) \
null: \
\( ref3.pdf -frame 2x2 \) \
null: \
\( delta-ref1-ref3.pdf -frame 2x2 \) \
+append \
ref1-ref3-delta.png
Run Code Online (Sandbox Code Playgroud)

如您所见,0(数字“零”)和O(字母o,大写版本)的不同形状非常突出。
现在是下一个:ref1.pdf与 相比ref2.pdf,也是 72 PPI。
compare -metric phash ref1.pdf ref2.pdf delta-ref1-ref2.pdf
0
Run Code Online (Sandbox Code Playgroud)
现在返回的 pHash 值是0。这表明 ImageMagick 没有发现任何差异!
创建三个 PDF/图像的并排可视化:
convert \
-mattecolor blue \
\( ref1.pdf -frame 2x2 \) \
null: \
\( ref2.pdf -frame 2x2 \) \
null: \
\( delta-ref1-ref2.pdf -frame 2x2 \) \
+append \
ref1-ref2-delta.png
Run Code Online (Sandbox Code Playgroud)

如您所见,在 72 PPI 时,ImageMagick 没有发现两个 PDF 之间的差异(如红色像素所示)。根据 Ghostscript 命令,两者都显示 digit 0,但在 x 和 y 方向上相距 0.1 pt 的位置。所以实际上,在原始 PDF 中,是有区别的。但是当以 72 PPI 渲染时,这种差异是不可见的。
让我们试着看看与density 600then的区别:
compare \
-metric phash \
-density 600 \
ref1.pdf \
ref2.pdf \
ref1-ref2-at-density600-delta.png
0.00172769
Run Code Online (Sandbox Code Playgroud)
现在 600 PPI 时返回的 pHash 值为0.00172769. 这接近于零,但仍有差异。差值小于ref1.pdf和之间的差值ref3.pdf。
现在在视觉比较中清楚地突出了差异,即使只有一条红色像素的细线:

使用PIL/Pillow:
from PIL import Image
im1 = Image.open('image1.jpg')
im2 = Image.open('image2.jpg')
if list(im1.getdata()) == list(im2.getdata()):
print "Identical"
else:
print "Different"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4260 次 |
| 最近记录: |