Ниже приведен код, который я использовал, и причины, по которым я применил каждый фильтр.Я провел множество тестов для этих функций и настроек, но вы все равно захотите запустить некоторые тесты для оптимизации этих настроек для вашего набора изображений.
Я использовал IMagick (PHP-оболочка для ImageMagick ) для выполнения работы при расчете следующих атрибутов изображения:
$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 в его ответе) для каждого изображения в моей системе.Когда я выбираю изображения для отображения, я обычно упорядочиваю их по этой энтропии в порядке убывания.Чем выше энтропия, тем больше вероятность, что изображение будет фотографией реальной вещи, а не графикой.У этого метода есть три основные проблемы:
Из-за большой глубины цвета и вариации цвета графика с высокой степенью стилизации имеет большую энтропию.
Фотографии, на которых были сделаны фотоснимки, чтобы иметь сплошной фон и фон студии, как правило, имеют меньшую энтропию из-за доминирующего сплошного цвета.
Это не сработало как абсолютный фильтр из-за широкогоразличия между изображениями в моем наборе, их типами файлов, глубиной цвета и т. д. Однако это чрезвычайно полезно при выборе лучшего изображения из небольшого подмножества во всем моем наборе.Например, можно выбрать, какое изображение отображать в качестве основного изображения из всех изображений, найденных на одной веб-странице.
Вот функция, которую я использую для вычисления энтропии изображения:
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;
}