J'ai un répertoire d'images, de photos, de graphiques Web, de logos, etc. Ils sont tous tirés du web. Il y a des fichiers .jpg, .gif et .png. P>
Je voudrais extraire des images de choses réelles (conserver des photos et supprimer des graphiques). Je n'essaie pas d'obtenir des photographies actuelles / originales, des images de vrais trucs de véritable par rapport aux graphiques de l'ordinateur (je ne sais pas comment le dire plus clairement). Presque toutes ces images ont été manipulées et les informations exif ne seront pas disponibles. p>
une grande marge d'erreur (même très grande) est acceptable. P>
J'ai déjà: p>
ImagecolorsTal () Code> Li>
- Les images retirées qui ont des rapports de grande hauteur à la largeur, et inversement (un rapport de 3+ oeuvres de 3+ bien bien). LI>
- Les images supprimées sont plus petites qu'une certaine dimension (50-75px est bonne) li>
ul>
Je pense à retirer des images avec des valeurs d'histogramme concentrées autour de certaines couleurs, plutôt qu'une courbe lisse ou distribuée. Je n'ai pas encore tenté cela. P>
Comment puis-je améliorer ce filtrage d'images pour extraire (principalement) de vraies photos? Je préférerais utiliser php mais ce n'est pas nécessaire. P>
Mise à jour: il s'avère que pour ma demande, les trois premières choses que j'avais déjà essayées étaient une solution solide de 80%. Un filtrage supplémentaire peut être effectué en utilisant certaines des réponses ci-dessous. P>
4 Réponses :
La fonction exif_read_data peut fournir des informations sur les caméras utilisées, elle diffère grandement pour chaque caméra. Ce ne sera pas la solution parfaite mais il faut ajouter à ce que vous utilisez déjà. P>
C'est une excellente suggestion, mais la plupart de ces images ont été manipulées et une information exif n'est pas disponible. Ce sont des images Web et non des photos originales.
Les graphiques et le dessin des lignes sont généralement plus petits lorsqu'ils sont stockés en tant que PNG, tandis que les photos sont plus petites lorsqu'elles sont stockées en tant que JPG. Conservez chaque image dans chaque format et apportez une supposition éduquée en fonction de la taille du fichier. P>
entropie serait une bonne métrique pour différencier les photos "réelles" de l'ordinateur graphique. Ce n'est vraiment qu'une version plus structurée de votre idée d'histogramme. L'entropie est donnée par où p [i] est la probabilité de la couleur de la couleur. Notez que les fichiers compressés sont directement liés à l'entropie (entropie supérieure, optimisation ultérieure), Donc, la suggestion d'une autre réponse à utiliser FileDize pourrait être une manière indirecte d'obtenir à cela. p> p> p [i] code> est à peu près la valeur de l'histogramme à chaque couleur (pourcentage (0,0-> 1,0) de pixels une couleur I). Plus les couleurs sont distribuées, le H (x) supérieur (x) code> sera. Si les pixels ne sont distribués que parmi quelques couleurs, h (x) code> sera petit. P>
Toute suggestion sur la façon de calculer P [I] avec PHP?
p [i] est simplement l'histgogramme d'image afin de pouvoir trouver du code PHP pour calculer cela. Assurez-vous simplement que l'histogramme est donné en pourcentages (0,0-> 1,0), pas les chiffres bruts de chaque couleur. En outre, assurez-vous de définir le cas spécial de log2 (0) = 0 qui est généralement indéfini.
ci-dessous est le code que j'ai utilisé et le raisonnement derrière la raison pour laquelle j'ai appliqué chaque filtre. J'ai effectué beaucoup de tests sur ces fonctions et paramètres, mais vous voudrez toujours exécuter des tests pour optimiser ces paramètres pour votre ensemble d'images.
J'ai utilisé imagick (le wrapper PHP pour imagemagick ) Pour effectuer le travail lors du calcul des attributs d'image suivants: P>
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;
}
Vous pouvez utiliser la bibliothèque GD pour pouvoir traiter les données d'image brute et vérifier des éléments tels que des arêtes, une similitude d'image et d'autres choses. Je posterais quelque chose de plus précis, mais php.net semble être en train d'être réduit pour moi pour le moment. J'ai déjà utilisé GD avant d'insérer des filigranes et autres, c'est un peu complexe, mais vous pouvez également faire beaucoup avec elle.
Que diriez-vous de vérifier
exif code>? - php.net/manual/fr/book.exif.php