2011-08-09 63 views
12

我有一個圖片,照片,網頁圖形,標誌等目錄...這些都是從網上拉出來的。有.jpg,.gif和.png文件。如何區分圖形和照片?

我想提取真實的圖像(保留照片和刪除圖形)。我不是想要得到實際的/原始的照片,只是現實生活中的東西與電腦製作的圖像的圖像(我不知道如何更清楚地說出這些)。幾乎所有這些圖像都被操縱,exif信息將不可用。

一個很大(甚至非常大)的誤差容限是可以接受的。使用具有大的高度與寬度的比率,並且反之亦然(3+的比率工作的令人吃驚的孔)imagecolorstotal()

  • 除去圖像

    • 具有低顏色計數除去圖像:

      我已經。

    • 除去了比某一尺寸較小的圖像(50-75px是好的)

    我在考慮與周圍某些顏色濃縮直方圖值去除的圖像,而不是光滑或分佈曲線。我還沒有嘗試過。

    我還可以如何改進這種圖像過濾來提取(大部分)真實照片?我寧願使用PHP,但這不是必需的。

    更新:事實證明,對於我的應用程序,我已經嘗試的前三件事是堅實的80%解決方案。進一步的篩選可以使用下面的一些答案來完成。

  • +0

    你可以使用GD庫能夠處理原始圖像數據,並檢查之類的邊緣,圖像相似性,其他事情。我會張貼更精確的東西,但目前php.net似乎對我而言很糟糕。 我以前用過GD插入水印之類的,有點複雜,但你也可以用它做很多。 – 2011-08-09 10:55:57

    +0

    如何檢查'exif'? - http://php.net/manual/en/book.exif.php – ajreal

    回答

    2

    下面是我使用過的代碼和爲什麼我應用了每個過濾器的原因。我已經對這些功能和設置進行了大量測試,但您仍然需要運行一些測試來優化您的圖像集的這些設置。

    我用IMagick(爲ImageMagick的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. 由於顯性純色,已經被photoshopped具有純色背景和工作室背景的照片傾向於具有較低的熵。

    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; 
    
    } 
    
    7

    函數exif_read_data可以提供有關所用攝像機的信息,它對於每個攝像機都有很大不同。這不會是完美的解決方案,但它應該增加你已經使用的。

    +0

    這是一個很好的建議,但大多數這些圖像已被操縱和exif信息不可用。他們是網絡圖像,而不是原始照片。 –

    1

    以png存儲時,圖形和線條圖通常較小,而以jpg存儲時照片較小。以每種格式存儲每個圖像,並根據文件大小做出有根據的猜測。

    6

    Entropy將是一個很好的指標,可以將「真實」照片與計算機圖形進行區分。它實際上只是一個更直觀的直方圖構思版本。熵由下式給出:

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

    其中p [i]是第i種顏色的概率。 p[i]幾乎是每種顏色的直方圖值(顏色i)的像素百分比(0.0-> 1.0))。顏色分佈越廣泛,將會有更高的H(X)。如果像素僅分佈在幾種顏色中,則H(X)將很小。

    請注意,壓縮文件大小與熵(較高熵,較高文件大小)直接相關,所以在使用文件大小的另一個答案中的建議可能是獲取此內容的間接方式。

    +0

    關於如何用php計算p [i]的任何建議? –

    +1

    p [i]只是圖像的直方圖,所以你應該可以找到一些php代碼來計算它。只要確保直方圖以百分比(0.0-> 1.0)給出,而不是每種顏色的原始計數。另外,確保你定義了log2(0)= 0的特殊情況,這通常是未定義的。 –

    相關問題