4

昨晚睡觉前,我再次浏览了Learning Perl的Scalar Data部分,发现了以下句子:

字符串中包含任何字符的能力意味着您可以将原始二进制数据作为字符串创建、扫描和操作。

我立刻想到我可以让 Perl 扫描我存储在硬盘上的图片以检查它们是否包含字符串 Adob​​e。似乎通过这样做,我可以分辨出其中哪些已被photoshop过。所以我尝试实现这个想法并想出了以下代码:

#!perl
use autodie;
use strict;
use warnings;

{
    local $/="\n\n";
    my $dir = 'f:/TestPix/';
    my @pix = glob "$dir/*";

    foreach my $file (@pix) {
        open  my $pic,'<',  "$file";

        while(<$pic>) {
            if (/Adobe/) {
                print "$file\n";
            }
        }
    }
}

令人兴奋的是,代码似乎真的很有效,它可以过滤掉经过 photoshop 处理的图片。但问题是许多图片是由其他实用程序编辑的。我想我有点卡在那里。我们是否有一些简单但通用的方法来判断数码图片是否经过编辑,例如

if (!= /the origianl format/) {...}

还是我们只需要添加更多条件?像

if (/Adobe/|/ACDSee/|/some other picture editors/)

对此有什么想法吗?还是因为我的编程知识非常有限而过于简单化了?

一如既往地感谢您的任何指导。

4

10 回答 10

8

在 Perl 中最好的选择可能是ExifTool。这使您可以访问嵌入到图像中的任何非图像信息。但是,正如其他人所说,当然可以删除这些信息。

于 2009-10-26T04:28:08.753 回答
4

我不会说绝对没有办法检测图像中的变化,但这个问题非常困难。

我认识的唯一一个声称有答案的人是Neal Krawetz 博士,他声称图像的数字更改部分与原始部分的压缩错误率不同。他声称以不同的质量级别重新保存 JPEG 将突出这些差异。

在我的调查中,我没有发现这种情况,但也许你可能会有更好的结果。

于 2009-10-26T05:37:18.653 回答
3

不。完美编辑的图像与从一开始就是这样的图像之间没有功能区别 - 毕竟,它最终只是一袋像素,以及您可以删除或伪造的任何其他元数据想。

于 2009-10-26T04:25:51.990 回答
3

用于编辑图像的图形程序的名称不是图像数据本身的一部分,而是称为元数据的东西 - 它可能存储在图像文件中,但正如其他人所指出的那样,它们都不是必需的(因此某些程序可能不需要存储它,有些可能允许您选择不存储它)也不可靠 - 如果您伪造图像,您可能也伪造了元数据。

因此,您的问题的答案是“不,无法普遍判断图片是否经过编辑,尽管某些图像编辑软件可能会将其签名写入图像文件,并且会因编辑人员的粗心而留在那里.

于 2009-10-26T04:41:56.643 回答
3

如果你想了解更多关于 Perl 图像处理的知识,你可以看看 CPAN 提供的一些优秀模块:

  • Image::Magick - 读取、操作和写入大量图像文件格式
  • GD - 使用大量图形基元创建彩色绘图,并以各种格式发出绘图。
  • GD::Graph - 创建图表
  • GD::Graph3d - 使用 GD 和 GD::Graph 创建 3D 图形

但是,还有其他实用程序可用于识别各种图像格式。对于Super User来说,这更像是一个问题,但对于各种 unix 发行版,您可以使用它file来识别许多不同类型的文件,对于 MacOSX,Graphic Converter从未让我失望。(它甚至能够打开我从兽医那里得到的一张我猫破碎骨盆的奇怪的多文件 X 光片。)

于 2009-10-26T06:21:35.233 回答
1

你怎么知道原始格式是什么?我很确定没有保证可以判断图像是否已被修改。

我可以打开文件(使用我最喜欢的编程语言和文件系统 API),然后随意将我想要的任何内容写入该文件。只要我不搞砸文件格式,你永远不会知道它发生了。

哎呀,我可以把图像打印出来,然后再扫描回来;你如何从原件中分辨出来?

于 2009-10-26T04:25:40.870 回答
1

正如其他人所说,没有办法知道图像是否被篡改。我猜您基本上想知道的是真实照片与经过增强或修改的照片之间的区别。

总是可以选择运行一些极其复杂的图像识别算法,它会分析图像中的每个像素,并做一些非常复杂的事情来确定图像是否被篡改。这个解决方案可能会涉及人工智能,它会检查数百万张经过篡改和未篡改的照片,并从中学习。但是,这更多是理论上的解决方案,不是很实用……您可能只会在电影中看到它。开发起来非常复杂,可能需要数年时间。即使你确实得到了这样的东西,它可能仍然不会一直 100% 正确。我猜人工智能技术还没有达到那个水平,可能需要一段时间才能达到。

于 2009-10-26T05:24:58.890 回答
1

exiftool 的一个不为人知的功能允许您通过分析 JPEG 量化表(不依赖于图像元数据)来识别原始软件。它识别由许多应用程序编写的表。请注意,某些相机可能使用与某些应用程序相同的量化表,因此这不是 100% 的解决方案,但值得研究。这是 exiftool 在两个图像上运行的示例,第一个是由 Photoshop 编辑的。

> exiftool -jpegdigest a.jpg b.jpg
======== a.jpg
JPEG Digest                     : Adobe Photoshop, Quality 10
======== b.jpg
JPEG Digest                     : Canon EOS 30D/40D/50D/300D, Normal
    2 image files read

即使元数据已被删除,这也将起作用。

于 2009-10-28T14:05:51.150 回答
0

现有的软件使用各种技术(压缩伪影、与相机数据库中的签名配置文件进行比较等)来分析实际图像数据以寻找更改的证据。如果您可以访问此类软件并且您可用的软件提供了用于外部访问这些分析功能的 API,那么很有可能存在与该 API 接口的 Perl 模块,如果不存在此类模块,它可以可能会很快创建。

理论上,也可以直接在本机 Perl 中实现图像分析代码,但我不知道有人这样做过,我希望你最好写一些低级和处理器密集型的东西使用完全编译的语言(例如,C/C++)而不是 Perl。

于 2009-10-26T12:56:52.997 回答
0

http://www.impulseadventure.com/photo/jpeg-snoop.html 是一个几乎可以完成这项工作的工具

如果有任何克隆,则像素密度会有所变化..或有时会出现浓度变化..在手动检查时,Photoshop克隆区域将具有均匀的像素密度(我的意思是扫描图像的像素变化)

于 2010-01-05T22:43:28.817 回答