A continuación se muestra el código que he utilizado y el razonamiento detrás de por qué he aplicado cada filtro. He realizado muchas pruebas sobre estas funciones y configuraciones, pero aún querrás ejecutar algunas pruebas para optimizar estas configuraciones para tu conjunto de imágenes.
He usado IMagick (la envoltura de PHP para ImageMagick) para hacer el trabajo en el cálculo de la siguiente imagen atributos:
$Image = new Imagick($image_path);
$height = $Image->getImageHeight();
$width = $Image->getImageWidth();
$histogram = $Image->getImageHistogram();
$num_colors = $image->getImageColors();
de altura a anchura
imágenes Filtrado por una relación altura/ancho elimina un gran porcentaje de basura. Cuanto más cerca esté de configurar su filtro a 1: 1, mejor funcionará este filtro, pero también comenzará a filtrar muchas buenas imágenes. Este es uno de los filtros más valiosas que he aplicado:
// 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");
Número de colores
imágenes Filtrado por debajo de 32 colores por lo general sólo elimina las imágenes de la chatarra, sin embargo, también perdido mucho diagramas y dibujos en blanco y negro.
// 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");
Altura Min y ancho de
imágenes Filtrado basado en una altura mínima absoluta y anchura que ambas dimensiones deben pasar, así como un valor ligeramente mayor que al menos una dimensión debe pasar ayudado filtra algo de basura
// 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");
Color entropía utilizando el histograma de la imagen
Por último, calculo entropía imagen en color (según lo sugerido por @ Jason en su respuesta) para cada imagen en mi sistema. Cuando elijo imágenes para mostrar, generalmente las ordeno ordenadas por esta entropía en orden descendente. Cuanto mayor sea la entropía, más probable es que una imagen sea una fotografía de una cosa real, en comparación con un gráfico. Hay tres grandes problemas con este método:
gráficos muy estilizadas tienden a tener mayores entropías debido a la gran variación de la profundidad de color y el color.
Las fotografías que han sido retocadas con fondos sólidos y fondos de estudio tienden a tener entropías más bajas debido al color sólido dominante.
Esto no funcionó bien como un filtro absoluto debido a la gran variación entre las imágenes en mi conjunto, sus tipos de archivos, profundidades de color, etc. Sin embargo, es sumamente útil para elegir la mejor imagen de un pequeño subconjunto dentro de todo mi conjunto. Un ejemplo sería elegir qué imagen mostrar como la imagen principal de todas las imágenes encontradas en una página web.
Aquí es la función que utilizo para calcular la entropía imagen:
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;
}
podría utilizar la biblioteca GD para poder procesar los datos de imágenes en bruto, y comprobar si hay cosas como bordes, similitud de imagen y otras cosas. Publicaría algo más preciso, pero php.net parece estar mal para mí en este momento. He utilizado GD antes para insertar marcas de agua y similares, es un poco complejo, pero también se puede hacer mucho con él. –
¿qué hay de la comprobación de 'exif'? - http://php.net/manual/en/book.exif.php – ajreal