J'ai une bibliothèque de 1 million d'images, et environ la moitié d'entre elles sont filigètes avec le même filigrane transparent au même endroit. P>
Où puis-je commencer, détecter les images avec les filigranes? Y a-t-il des outils standard à cette fin? P>
6 Réponses :
Eh bien s'il n'y a pas d'outil pour le faire, vous pouvez essayer ce qui suit: p>
Identifiez l'endroit où le filigrane apparaît sous forme de pourcentage de pixels, par exemple inférieur droit 40px x 100px p> li>
Pour chaque image, faites une copie temporaire et récapitulez l'emplacement de l'apparition du filigrane. Cela devrait laisser à la fois la version filigrane et la version non filigrée comme la même p> li>
comparer les images - par exemple Combinaison de largeur x hauteur, de fichiers, de CRC ou de pixels réelle, bien que pendant un million d'images, vous auriez besoin d'une puissance de processeur sérieuse. P> li> ol>
Où obtenez-vous l'image sans filigrane de cet exemple?
Je dis que vous récollez toutes les images (ou définissez la zone sur noir ou blanc) où le filigrane apparaît. L'affiche a déclaré que le filigrane apparaît toujours au même endroit, cela devrait donc fonctionner
Donc, si le filigrane est une ligne de fil de 50% de la diagonale sur l'image, vous ne récoltez rien (comme vous savez que le filigrane traverserait la diagonale) et voir si elle correspond à quoi?
Vrai - j'ai supposé du libellé de l'affiche que le filigrane était petit "appelé un endroit". Mais même s'il s'agit d'une grande ligne diagonale, vous pouvez prendre ce filigrane à partir d'une image en filigrane existante et l'appliquer à toutes les images, qui vous permet de les comparer.
Pas si c'est translucide (comme décrit)
Détection de presque toutes les fonctionnalités d'une image est appelée Mais je ne dépendra pas vraiment de cette solution et de considérer mes priorités. En outre, il est très difficile d'obtenir un bon taux avec un classificateur personnalisé. D'autres méthodes consomment plus de temps. P>
En bref, pas avec une précision complète. P>
Au mieux, vous pouvez uniquement appliquer des heuristiques sur l'image pour voir s'il correspond à un filigrane exact et obtenez une note de confiance - par exemple, si le filigrane si une superposition de 50% blanche, une scène qui était principalement blanche. pourrait em> donner un faux positif et bien sûr, l'inverse est vrai. P>
Il existe également des problèmes qui pourraient survenir si les images utilisent une compression à perte, telle que JPEG, comme les bords, et la saturation peut entraîner un filigrane qui n'est pas aussi saturé que prévu, ou comme prévu comme prévu. p>
Vous m'avez coupé dans la bonne direction ici, merci. L'image à moitié transparente est toujours en train d'égayer l'image avec plus de blanc dans les mêmes endroits
Une heuristique simple serait de rechercher des pixels où le texte serait d'avoir une luminosité inférieure à 50% pour obtenir une métrique de «échec» - de cause, cela donnera de faux positifs (considérez les chiffres de votre échantillon)
Parce que vous savez où le filigrane est toujours possible que vous puissiez utiliser Imagecolorat A> et ImageColorsforindex pour obtenir la valeur alpha pour les pixels à l'intérieur et à l'extérieur du filigrane. Je m'attendrais à ce que les valeurs alpha soient similaires lorsqu'il n'y a pas de filigrane, et différent lorsqu'il y a (quelques seuils dont vous auriez besoin pour déterminer). Bien sûr, cela peut ne pas fonctionner sur toutes les images, donc si vous avez besoin de précision de 100%, vous auriez probablement besoin de quelque chose de plus fiable. P>
Si, selon votre question, vous souhaitez simplement détecter les images en filigrane, vous pouvez utiliser l'algorithme suivant:
Le code pourrait être quelque chose comme ceci: P>
$no_of_pixels = what_you_got;
$matched = 0;
$thumbpixels = array();
$wmark = imagecreatefrompng("watermark.png");
list($width, $height) = getimagesize("watermark.png");
$tesimage = imagecreatefrompng("test.png");
for($h = 0; $h < $height; $h++){
for($w = 0; $w < $width; $w++){
if(imagecolorsforindex($testimage, imagecolorat($testimage, $w, $h)) == $thumbpixels[0]){
while($thumbpixels[$i++] === imagecolorsforindex($tesimage, imagecolorat($wmark, $w, $h)) && $no_of_pixels != $matched){
$matched++;
}
if($matched == $no_of_pixels) echo "Voila, we found it!";
}
}
}
Dans votre cas, où vous recherchez le même logo dans un endroit prévisible, il est relativement simple. Cependant, c'est beaucoup plus simple et plus rapide (selon mon commentaire ailleurs) pour faire correspondre un avis de copyright dans les métadonnées! P>
Un filigrane ne produira pas de modifications fixes au contenu - chaque pixel modifié obtiendra une nouvelle valeur basée sur le filigrane et l'image elle-même. Par conséquent, vous devez extraire cette information - j'irais avec différentes images et je regarde simplement la magnitude de la dérivée (pas la phase). p>
Alors c'est simplement une question de Corrélation le différentiel avec l'un des tout le filigrane (ou les lots avec le filigrane et autre contenu). P>
Vous ne voulez vraiment pas faire ce genre de traitement de l'image chez PHP à moins que vous n'ayez heureux d'écrire vos propres extensions. La plupart des outils à outils de traitement d'images faciliteront la différenciation et la corrélation. P>
BTW: Si vous ne savez pas comment différencier une image, et / ou ne pouvez pas comprendre comment corréler une image, veuillez ne pas demander - ce n'est pas le bon forum pour cette discussion p>
... et en regardant votre exemple, il suggère que le filigrane n'est pas toujours dans la même position - il est aligné de manière centralisée de gauche à droite, et le nombre implique que cela change, donc la position change.
Avez-vous vérifié les méta-données pour voir si elles ont également une notification de copyright lisible par machine?
Oui, ces images n'ont pas de métadonnées comme ça.
Quelle est la taille du filigrane, et où apparaît-il dans l'image?
Voir l'exemple: Postimage.org/image/4itd1v203