下面是我使用過的代碼和爲什麼我應用了每個過濾器的原因。我已經對這些功能和設置進行了大量測試,但您仍然需要運行一些測試來優化您的圖像集的這些設置。
我用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在他的回答提出)。當我選擇要顯示的圖像時,我通常會按照這個熵順序排列它們。熵越高,圖像越可能成爲真實照片,而不是圖形。有三個主要問題用這種方法:
高度風格化的圖形往往有因爲偉大的顏色深度和顏色變化的高熵。
由於顯性純色,已經被photoshopped具有純色背景和工作室背景的照片傾向於具有較低的熵。
由於我設置的圖像,它們的文件類型,顏色深度等等之間的差異很大,因此這不能很好地作爲絕對過濾器。但是,它非常有用的地方在於選擇最佳圖像在我整個集合內的一小部分。一個例子是選擇哪個圖像作爲主圖像顯示在一個網頁上的所有圖像中。
這裏是我用來計算圖像熵的功能:
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;
}
你可以使用GD庫能夠處理原始圖像數據,並檢查之類的邊緣,圖像相似性,其他事情。我會張貼更精確的東西,但目前php.net似乎對我而言很糟糕。 我以前用過GD插入水印之類的,有點複雜,但你也可以用它做很多。 – 2011-08-09 10:55:57
如何檢查'exif'? - http://php.net/manual/en/book.exif.php – ajreal