Come posso rilevare le foto ingrandite?


8

Ho una raccolta di foto JPEG, ciascuna da 500 a 600 pixel sul lato più lungo. Come posso rilevare quali sono stati ingranditi algoritmicamente da una foto sostanzialmente più piccola?

Un marketplace online richiede a ciascun venditore di caricare le foto dei prodotti che vende e queste foto devono avere una larghezza di almeno 500 pixel o alte 500 pixel perché le foto dei prodotti con pochi dettagli causano un'esperienza negativa per gli acquirenti. Posso già dire se un venditore sta cercando di aggirare questo requisito aggiungendo un bordo a tinta unita, ad esempio estendendo lo sfondo bianco standard con più bianco. Ma ultimamente, i venditori hanno iniziato a aggirare questo problema aumentando le vecchie foto scattate prima della pubblicazione del requisito di 500 pixel. Qual è un buon modo per determinare se le foto sono state ingrandite con l'interpolazione più vicina, bilineare o bicubica?


Solo per chiarire, stai chiedendo un rilevamento completamente automatico, senza alcuna valutazione da parte dei bulbi oculari umani?
Junkyardsparkle,

4
Per un test automatico, è più probabile che stackoverflow ti dia una risposta
Renan Le Caro,

@Renan Anche un test manuale che utilizza una sequenza di filtri GIMP potrebbe funzionare per un controllo a campione delle immagini di un particolare venditore.
Damian Yerrick,

1
Immagino che la domanda che dobbiamo porci sia: perché te ne importa? Fa abbastanza differenza per la risposta ...
James Snell,

@JamesSnell Le foto cattive respingono gli acquirenti. Vedi ad esempio la guida di eBay .
Damian Yerrick,

Risposte:


9

Chiedi a un cane di annusare la sfocatura nelle foto.

Se stai penalizzando le foto ingrandite digitalmente, potresti anche penalizzare le foto sfocate. I bordi e i dettagli sfocati in entrambi causano la stessa brutta esperienza per gli spettatori, indipendentemente dal fatto che sia causato da una piccola messa a fuoco originale o scadente. Quello che vuoi fare è rilevare la sfocatura, che è un'assenza di alte frequenze spaziali.

Prova a prendere la differenza tra un'immagine e una copia sfocata di se stessa. Se un'immagine è già sfocata, una sfocatura gaussiana di 1 pixel non cambierà l'immagine come se fosse nitida. Quindi ci sarà più differenza tra un'immagine nitida e una versione sfocata rispetto a un'immagine sfocata e un'ulteriore versione sfocata. Nella visione artificiale, questa tecnica è chiamata la " differenza dei gaussiani " (DOG).

  1. Apri l'immagine in GIMP o in un altro editor di foto a più livelli.
  2. Duplica il livello.
  3. Applica una sfocatura gaussiana con un raggio di 1 pixel a questo nuovo livello.
  4. Cambia la modalità di livello in "Differenza". L'immagine diventerà nera ad eccezione dei bordi.
  5. Ripetere i passaggi da 1 a 4 per un'immagine nitida nota di soggetto, composizione e dimensioni simili.
  6. Confronta l'intensità dei bordi nelle due immagini di differenza. Puoi osservarlo o usare un istogramma.

Ho appena provato questo su una foto di 400x480 pixel e sulla stessa cosa che era stata ridotta a 200x240 (50%) e poi ingrandita di nuovo a 400x480 (200%), e i bordi nella foto ingrandita erano notevolmente più deboli. Non sarà determinante per un lieve allargamento come il 140%, ma colpirà casi palesi.

Diverse librerie di computer vision includono mezzi per calcolare la differenza di gaussiani su un'immagine. Così fanno molti editor di immagini grafiche. Versioni recenti di GIMP, ad esempio. includere una macro DOG che automatizza i passaggi da 2 a 4: Filtri> Rileva contorni> Differenza di gaussiani, quindi impostare i raggi su 1,0 e 0,0.

Domande correlate su altri siti Stack Exchange:

DOG non catturerà il vicino più vicino, ma puoi farlo cercando uno schema di righe e colonne identiche al loro vicino immediato verso l'alto o a sinistra.

  1. Apri l'immagine
  2. Duplica il livello.
  3. Offset il nuovo livello di un pixel verso l'alto o verso sinistra.
  4. Cambia la modalità di livello in "Differenza".
  5. Cerca un modello di righe vuote.

1
Che cosa succede se all'immagine ingrandita è applicata una maschera di contrasto molto forte?
Leggi il mio profilo il

1
La maschera di contrasto @mattdm aumenta il contrasto, non crea contenuti di immagini ad alta frequenza.
Matt Grum,

@mattdm USM è un filtro high-boost: x + amt*(x - GB(x, r)). Combinando USM e allargando aumenterai solo i medi (frequenze spaziali medie), non i massimi, perché i massimi non esistono. DOG (x, 1, 0) isola gli alti.
Damian Yerrick,

1

Non credo che ciò sia possibile in senso generale. Esistono molti possibili algoritmi di upscaling, con una firma che può essere difficile da rilevare in modo inequivocabile senza la conoscenza del contenuto dell'immagine (ad esempio, un'area upscaled di colore uniforme è ancora colore uniforme ...).

Probabilmente un'opzione sarebbe quella di calcolare una metrica per la complessità dell'immagine, come una stima dell'entropia (ad esempio vedi /programming/4935380/get-or-calculate-the-entropy-of-an-image-with -ruby-and-imagemagick ).

Se lo fai su un gran numero di immagini, puoi generare statistiche per l'intera raccolta. È quindi possibile rivedere manualmente le immagini anomale in tali statistiche.

Purtroppo, ciò si tradurrà sempre in falsi positivi e le immagini che sono state ridimensionate bene potrebbero non essere catturate (ma se sono buone, importa?)


Mi piace l'ultima parte: se nessuno può dirlo, a chi importa? Mi ricorda questo Xkcd . (Attenzione: linguaggio forte.)
Leggi il mio profilo

0

Avrei un approccio ibrido. Penso che le altre idee sull'uso di una differenza di gaussiani, sul controllo di EXIF ​​o di altri metadati o persino della FFT possano essere combinate. Un altro modo forse più semplice è semplicemente prendere ogni immagine, ridimensionarla, ridimensionarla e confrontarla. Se sono molto simili (usando qualcosa come Delta E , forse), è probabile che siano stati ingranditi (o sfocati come suggerisce un altro post). Forse potresti stabilire una soglia del numero di test superati o falliti? Se supera la metà dei test, allora va bene, altrimenti è male, o ha bisogno di un intervento umano per verificarlo, o qualcosa del genere.


0

Dovresti essere in grado di fare un lavoro abbastanza buono decomprimendo parzialmente i dati JPEG stessi e facendo un conteggio banale.

I dati JPEG vengono creati eseguendo una trasformazione del coseno discreta sui dati dell'immagine originale, quantizzando (eliminando i dati ad alta risoluzione), quindi camminando attraverso il blocco DCT risultante in uno schema a zig-zag e comprimendo il flusso di bit risultante con la codifica Huffman.

Se inverti la codifica di Huffman e annulli lo zigzag, avrai una serie di blocchi DCT 8x8, in cui i dati di frequenza più bassa si trovano nell'angolo in alto a sinistra del blocco e le informazioni di frequenza più alta in basso a destra.

Ciò significa che puoi letteralmente dare un'occhiata ai dati in quel formato intermedio e dire se sono stati ricampionati, perché tutti i blocchi 8x8 avranno valori diversi da zero solo nell'angolo in alto a sinistra (approssimativamente).


0

In realtà puoi

Non hai bisogno di un cane per annusare la foto. Vai a:

http://rest7.com/image_upscaled

In questa pagina puoi caricare la tua immagine e ottenere dimensioni originali , in questo modo:

{
  "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
}

A volte non indovina correttamente la risoluzione originale. Penso che dipenda dall'algoritmo di ridimensionamento utilizzato nella foto. Ho anche scoperto che se una foto è stata ingrandita e quindi compressa in un formato JPEG con compressione pesante (come il 30%), i manufatti JPEG rendono più difficile indovinare questa pagina. Ma se le tue foto sono di buona qualità, ottimizzate utilizzando metodi popolari (Lanczos, Bilinear), dovrebbero essere abbastanza precise.

Ecco 2 immagini di esempio:

ORIGINALE

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

(scusa, non ho abbastanza reputazione per pubblicare più di 2 link)

UPSCALED & CROPPED

inserisci qui la descrizione dell'immagine

Se pubblichi la foto ritagliata questa pagina restituirà:

{
  "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
}

Quindi puoi vederlo rilevato che l'immagine è stata ingrandita e ritagliata. Non ti dirà la dimensione dell'immagine originale prima del ritaglio poiché non è possibile ottenere informazioni su qualcosa che è stato eliminato solo dai pixel che sono rimasti intatti.


Quel sito funzionerà solo finché ci si può fidare dei dati incorporati nell'immagine. Ma è banalmente facile modificare tali dati. E se stessi cercando di ingannare un mercato per denaro, altererei i dati a destra e al centro.
Peter M,

@PeterM Non sono del tutto sicuro di cosa intendi. Vuoi ritagliare un'immagine? Questo sito rileverà comunque che è stato ingrandito.
Jack,

Chiediti come sa che l'immagine è stata ritagliata. Dove pensi che siano archiviate le informazioni che dicono quali fossero le dimensioni dell'immagine originale?
Peter M,

@PeterM Beh, non sono sicuro di come funzioni esattamente ma l'ho usato un po 'e posso dirti che analizza i pixel e rileva la risoluzione originale basata su quello. Non analizza il formato del file ma i pixel stessi. Quindi la risoluzione originale non viene memorizzata da nessuna parte.
Jack,

@Jack Quando "analizza i pixel", probabilmente usa qualcosa come DOG.
Damian Yerrick,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.