【问题标题】:How can I distinguish between graphics and photographs?如何区分图形和照片?
【发布时间】:2011-08-09 10:39:17
【问题描述】:

我有一个包含图片、照片、网络图形、徽标等的目录……这些都是从网络上提取的。有 .jpg、.gif 和 .png 文件。

我想提取真实的图像(保留照片并删除图形)。我不是想获得实际/原始照片,只是现实生活中的东西与计算机制作的图形的图像(我不知道如何更清楚地说出来)。几乎所有这些图像都已被操纵,exif 信息将不可用。

较大(甚至非常大)的误差范围是可以接受的。

我已经:

  • 使用imagecolorstotal() 删除了低颜色计数的图像
  • 删除了高宽比较大的图像,反之亦然(3+ 的比例效果非常好)。
  • 移除小于特定尺寸的图片(50-75px 为佳)

我正在考虑删除直方图值集中在某些颜色周围的图像,而不是平滑或分布曲线。我还没有尝试过。

我还能如何改进这种对图像的过滤以提取(大部分)真实照片?我更喜欢使用 PHP,但这不是必需的。

更新:事实证明,对于我的应用程序,我已经尝试过的前三件事是一个可靠的 80% 解决方案。可以使用下面的一些答案进行进一步过滤。

【问题讨论】:

  • 您可以使用 GD 库来处理原始图像数据,并检查边缘、图像相似度等内容。我会发布更精确的内容,但 php.net 目前似乎对我不利。之前用过GD插入水印之类的,有点复杂,不过也可以做很多。
  • 检查exif怎么样? -- php.net/manual/en/book.exif.php

标签: php image-processing


【解决方案1】:

exif_read_data 函数可以提供有关使用的相机的信息,每个相机都有很大的不同。这不是完美的解决方案,但它应该会添加到您已经使用的内容中。

【讨论】:

  • 这是一个很好的建议,但是这些图像中的大多数已经过处理,并且 exif 信息不可用。它们是网络图像,而不是原始照片。
【解决方案2】:

Entropy 将是区分“真实”照片与计算机图形的良好指标。它实际上只是您的直方图想法的更结构化版本。熵由下式给出

H(X) = -sum(p[i] * log2(p[i]))

其中 p[i] 是第 i 个颜色的概率。 p[i] 几乎是每种颜色的直方图值(颜色 i 的像素百分比(0.0->1.0))。颜色分布得越多,H(X) 就越高。如果像素只分布在几种颜色中,H(X) 会很小。

请注意,压缩文件大小与熵直接相关(熵越高,文件大小越大),所以另一个答案中关于使用文件大小的建议可能是解决此问题的间接方式。

【讨论】:

  • 关于如何用 php 计算 p[i] 有什么建议吗?
  • p[i] 只是图像直方图,因此您应该能够找到一些 php 代码来计算它。只需确保以百分比(0.0->1.0)给出直方图,而不是每种颜色的原始计数。另外,请确保定义 log2(0)=0 的特殊情况,这通常是未定义的。
【解决方案3】:

以下是我使用的代码以及我应用每个过滤器的原因。我已经对这些功能和设置进行了大量测试,但您仍需要运行一些测试来优化您的图像集的这些设置。

在计算以下图像属性时,我使用了 IMagickImageMagick 的 PHP 包装器)来完成这项工作:

$Image      = new Imagick( $image_path );
$height     = $Image->getImageHeight();
$width      = $Image->getImageWidth();
$histogram  = $Image->getImageHistogram();              
$num_colors = $image->getImageColors();

高宽比

按高宽比过滤图像可消除大部分垃圾。将过滤器设置为 1:1 越接近,此过滤器的效果就越好,但您也会开始过滤很多好的图像。这是我应用的最有价值的过滤器之一:

// max height to width ratio we allow on images before we junk them
$max_size_ratio = 3;
if( $size_ratio > $max_size_ratio )
    throw new Exception( "image height to width ratio exceeded max of $max_size_ratio" );

颜色数量

过滤32色以下的图片一般只能去除垃圾图片,但是我也丢失了很多黑白图表和图纸。

// min number of colors allowed before junking
$min_colors = 32;
if( $num_colors < $min_colors )
    throw new Exception( "image had less than $min_colors colors" );

最小高度和宽度

根据两个维度必须通过的绝对最小高度和宽度以及至少一个维度必须通过的稍大的值过滤图像有助于过滤一些垃圾。

// min height and width in pixels both dimensions must meet
$min_height_single = 50;
$min_width_single  = 50;
if(
    $width < $min_width_single
    OR $height < $min_height_single
)
    throw new Exception( "height or width were smaller than absolute minimum" );

// min height and width in pixels at least one dimension must meet
$min_height = 75;
$min_width  = 75;
if(
    $width < $min_width
    && $height < $min_height
)
    throw new Exception( "height and width were both smaller than minimum combo" );

使用图像直方图的图像颜色熵

最后,我为系统中的每个图像计算图像颜色熵(正如@Jason 在他的回答中所建议的那样)。当我选择要显示的图像时,我通常按此熵按降序排列它们。熵越高,图像就越有可能是真实事物的照片,而不是图形。这种方法存在三个主要问题:

  1. 由于颜色深度和颜色变化很大,高度风格化的图形往往具有更高的熵。

  2. 经过 photoshop 处理以具有纯色背景和工作室背景的照片往往具有较低的熵,因为主要是纯色。

  3. 由于我的集合中的图像、它们的文件类型、颜色深度等之间存在很大差异,这作为绝对过滤器效果不佳。然而,它非常有用的地方在于选择最佳图像我的整个集合中的一个小子集。例如,从一个网页上找到的所有图像中选择要显示的主图像。

这是我用来计算图像熵的函数:

function set_image_entropy()
{

    // create Imagick object and get image data
    $Image = new Imagick( $this->path );
    $histogram = $Image->getImageHistogram();               
    $height = $Image->getImageHeight();
    $width = $Image->getImageWidth();
    $num_pixels = $height * $width;

    // calculate entropy for each color in the image
    foreach( $histogram as $color )
    {
        $color_count = $color->getColorCount();
        $color_percentage = $color_count / $num_pixels;
        $entropies[] = $color_percentage * log( $color_percentage, 2 );
    }

    // calculate total image color entropy
    $entropy = ( -1 ) * array_sum( $entropies );

    return $entropy;

}

【讨论】:

    【解决方案4】:

    以 png 格式存储的图形和线条图通常较小,而以 jpg 格式存储的照片较小。以每种格式存储每个图像,并根据文件大小做出有根据的猜测。

    【讨论】:

      猜你喜欢
      • 2012-12-13
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多