Comment détecter des photos mises à l'échelle?

8

J'ai une collection de photos JPEG, chacune de 500 à 600 pixels sur le côté le plus long. Comment puis-je détecter celles qui ont été agrandies algorithmiquement à partir d'une photo sensiblement plus petite?

Un marché en ligne exige que chaque vendeur télécharge des photos des produits qu'il vend, et ces photos doivent avoir au moins 500 pixels de large ou 500 pixels de haut car les photos de produits avec peu de détails provoquent une mauvaise expérience pour les acheteurs. Je peux déjà savoir si un vendeur essaie de contourner cette exigence en ajoutant une bordure de couleur unie, comme l'extension du fond blanc standard avec plus de blanc. Mais ces derniers temps, les vendeurs ont commencé à contourner cela en mettant à l'échelle les anciennes photos prises avant la publication de l'exigence de 500 pixels. Quelle est la bonne façon de déterminer si les photos ont été agrandies avec une interpolation du plus proche voisin, bilinéaire ou bicubique?

Damian Yerrick
la source
Juste pour clarifier, demandez-vous une détection entièrement automatisée, sans aucune évaluation par des globes oculaires humains?
junkyardsparkle
4
Pour un test automatisé, stackoverflow est plus susceptible de vous donner une réponse
Renan Le Caro
@Renan Même un test manuel utilisant une séquence de filtres GIMP pourrait fonctionner pour une vérification ponctuelle des images d'un vendeur particulier.
Damian Yerrick
1
Je suppose que la question que nous devons nous poser est pourquoi vous en souciez-vous? Cela fait toute une différence dans la réponse ...
James Snell
@JamesSnell Les mauvaises photos repoussent les acheteurs. Voir par exemple les conseils d'eBay .
Damian Yerrick

Réponses:

9

Demandez à un CHIEN de flairer les photos.

Si vous allez pénaliser les photos agrandies numériquement, vous pourriez aussi bien pénaliser les photos floues. Les bords flous et les détails des deux provoquent la même mauvaise expérience pour les téléspectateurs, qu'ils soient causés par un petit original ou une mise au point médiocre. Ce que vous voulez faire, c'est détecter le flou, c'est-à-dire l'absence de hautes fréquences spatiales.

Essayez de faire la différence entre une image et une copie floue d'elle-même. Si une image est déjà floue, un flou gaussien à 1 pixel ne changera pas l'image autant que si l'image était nette. Il y aura donc plus de différence entre une image nette et une version floue qu'entre une image floue et une autre version floue. En vision par ordinateur, cette technique est appelée la " différence des gaussiens " (DOG).

  1. Ouvrez l'image dans GIMP ou un autre éditeur de photos en couches.
  2. Dupliquez le calque.
  3. Appliquez un flou gaussien d'un rayon de 1 pixel à ce nouveau calque.
  4. Changez le mode de calque en "Différence". L'image deviendra noire à l'exception des bords.
  5. Répétez les étapes 1 à 4 pour une image nette connue d'un sujet, d'une composition et d'une taille similaires.
  6. Comparez l'intensité des bords dans les deux images de différence. Vous pouvez le regarder ou utiliser un histogramme.

J'ai juste essayé ceci sur une photo de 400x480 pixels et sur la même chose qui avait été réduite à 200x240 (50%) puis agrandie à 400x480 (200%), et les bords de la photo à l'échelle étaient nettement plus faibles. Il ne sera pas concluant sur un agrandissement léger tel que 140%, mais il attrapera des cas flagrants.

Plusieurs bibliothèques de vision par ordinateur incluent des moyens de calculer la différence de Gaussiens sur une image. Il en va de même pour de nombreux éditeurs d'images graphiques. Les versions récentes de GIMP, par exemple. inclure une macro DOG qui automatise les étapes 2 à 4: Filtres> Détection des bords> Différence des gaussiens, puis définissez les rayons sur 1,0 et 0,0.

Questions connexes sur d'autres sites Stack Exchange:

DOG n'attrapera pas le voisin le plus proche, mais vous pouvez le faire en recherchant un modèle de lignes et de colonnes identiques à leur voisin immédiat vers le haut ou vers la gauche.

  1. Ouvrez l'image.
  2. Dupliquez le calque.
  3. Décalez le nouveau calque d'un pixel vers le haut ou vers la gauche.
  4. Changez le mode de calque en "Différence".
  5. Recherchez un motif de lignes vierges.
Damian Yerrick
la source
1
Que se passe-t-il si l'image mise à l'échelle a un masque flou vraiment fort appliqué?
Veuillez lire mon profil le
1
Le masque flou @mattdm augmente le contraste, il ne crée pas de contenu d'image haute fréquence.
Matt Grum
@mattdm USM est un filtre haute-boost: x + amt*(x - GB(x, r)). La combinaison de USM et d'agrandissement ne stimulera que les médiums (fréquences spatiales moyennes), pas les aigus, car les aigus n'existent pas. DOG (x, 1, 0) isole les sommets.
Damian Yerrick
1

Je ne pense pas que cela soit possible au sens général. Il existe de nombreux algorithmes de mise à l'échelle possibles, avec une signature qui peut être difficile à détecter sans ambiguïté sans connaissance du contenu de l'image (à titre d'exemple extrême, une zone de couleur uniforme mise à l'échelle est toujours de couleur uniforme ...).

Une option serait peut-être de calculer une métrique pour la complexité de l'image, telle qu'une estimation d'entropie (par exemple, voir /programming/4935380/get-or-calculate-the-entropy-of-an-image-with -ruby-and-imagemagick ).

Si vous procédez ainsi sur un grand nombre d'images, vous pouvez générer des statistiques pour l'ensemble de la collection. Vous pouvez ensuite examiner manuellement les images qui sont aberrantes dans ces statistiques.

Malheureusement, cela entraînera toujours des faux positifs et les images qui ont été bien mises à l'échelle peuvent ne pas être capturées (mais si elles sont bonnes, est-ce important?)

Mark Moore
la source
J'aime la dernière partie - si personne ne peut le dire, qui s'en soucie? Me rappelle ce Xkcd . (Attention: langage fort.)
Veuillez lire mon profil le
0

Je prendrais une approche hybride. Je pense que les autres idées d'utiliser une différence de gaussiens, de vérifier EXIF ​​ou d'autres métadonnées, ou même FFT peuvent être combinées. Un autre moyen peut-être plus simple consiste à simplement prendre chaque image, à la réduire, à la redimensionner et à la comparer. S'ils sont très similaires (en utilisant peut-être quelque chose comme Delta E , peut-être), il est probable qu'ils ont été mis à l'échelle (ou flous comme le suggère un autre post). Peut-être pourriez-vous faire un seuil du nombre de tests réussis vs échoués? Si plus de la moitié des tests réussissent, c'est bien, sinon c'est mauvais, ou nécessite une intervention humaine pour vérifier, ou quelque chose comme ça.

user1118321
la source
0

Vous devriez être en mesure de faire un assez bon travail en déballant partiellement les données JPEG elles-mêmes et en effectuant un comptage trivial.

Les données JPEG sont créées en effectuant une transformation en cosinus discrète sur les données d'image d'origine, en quantifiant (en jetant les données haute résolution), puis en parcourant le bloc DCT résultant en zigzag et en compressant le flux de bits résultant avec le codage Huffman.

Si vous inversez le codage Huffman et annulez le zigzag, vous aurez une série de blocs DCT 8x8, dans lesquels les données de fréquence les plus basses se trouvent dans le coin supérieur gauche du bloc et les informations de fréquence les plus élevées sont en bas à droite.

Cela signifie que vous pouvez littéralement regarder les données dans ce format intermédiaire et dire si elles ont été suréchantillonnées, car tous les blocs 8x8 auront des valeurs non nulles uniquement dans le coin supérieur gauche (à peu près).

dgatwood
la source
0

En fait, vous pouvez

Vous n'avez pas besoin d'un chien pour renifler l'image. Aller à:

http://rest7.com/image_upscaled

Sur cette page, vous pouvez télécharger votre image et obtenir des dimensions originales , comme ceci:

{
  "is_upscaled": true,
  "current_width": "2000",
  "current_height": "928",
  "original_width": "1750",
  "original_height": "696",
  "accuracy": "82%",
  "accuracy_width": "82%",
  "accuracy_height": "82%",
  "success": 1
}

Parfois, il ne devine pas correctement la résolution d'origine. Je pense que cela dépend de l'algorithme de mise à l'échelle utilisé sur la photo. J'ai également découvert que si une photo était mise à l'échelle puis compressée au format JPEG avec une forte compression (comme 30%), les artefacts JPEG rendaient cette page plus difficile à deviner. Mais si vos photos sont de bonne qualité, mises à l'échelle en utilisant des méthodes populaires (Lanczos, Bilinéaire), elles devraient être assez précises.

Voici 2 exemples d'images:

ORIGINAL

https: // i. empiler. imgur. com / iXYKV.png

(désolé, je n'ai pas assez de réputation pour poster plus de 2 liens)

UPSCALED & CROPPED

entrez la description de l'image ici

Si vous postez la photo recadrée, cette page reviendra:

{
  "is_upscaled": true,
  "current_width": "700",
  "current_height": "300",
  "original_width": 352.33333333333,
  "original_height": 151,
  "accuracy": "57%",
  "accuracy_width": "57%",
  "accuracy_height": "57%",
  "cropped": true,
  "success": 1
}

Vous pouvez donc voir qu'il a détecté que l'image a été agrandie et recadrée. Il ne vous indiquera pas la taille de l'image d'origine avant le recadrage, car il n'est tout simplement pas possible d'obtenir des informations sur quelque chose qui a été supprimé uniquement à partir des pixels laissés intacts.

Jack
la source
Ce site ne fonctionnera que tant que vous pourrez faire confiance aux données intégrées à l'image. Mais il est trivialement facile de modifier ces données. Et si j'essayais de tromper un marché pour de l'argent, je modifierais les données de gauche à droite et au centre.
Peter M
@PeterM Je ne sais pas trop ce que tu veux dire. Vous souhaitez recadrer une image? Ce site détectera toujours qu'il a été mis à l'échelle.
Jack
Demandez-vous comment il sait que l'image a été recadrée. À votre avis, où sont stockées les informations qui indiquent la taille d'origine de l'image?
Peter M
@PeterM Eh bien, je ne sais pas exactement comment cela fonctionne, mais je l'ai utilisé un peu et je peux vous dire qu'il analyse les pixels et détecte la résolution d'origine en fonction de cela. Il n'analyse pas le format de fichier mais les pixels lui-même. La résolution d'origine n'est donc stockée nulle part.
Jack
@Jack Quand "il analyse les pixels", il utilise probablement quelque chose comme DOG.
Damian Yerrick