Sto lavorando con le immagini digitali che le persone hanno categorizzato manualmente su un numero di parametri.
Voglio poter trovare immagini simili o dissimili in base a determinate categorie. Ad esempio, potremmo voler scegliere due immagini casuali dal nostro database che hanno "significanza" simile, ma sono altrimenti il più diverse possibile.
Ad esempio, questa immagine di Stonehenge sarebbe categorizzata in questo modo:
colors: blue, green, grey
themes: natural, land, sky
brightness: light
location: outdoor
shapes: angular
texture: hard
lines: vertical
significance: historical
Le categorie sono per lo più fisse e piccole, quindi quando categorizzato manualmente la persona sceglie i colori principali da un elenco di dieci colori (rosso, arancione, giallo, verde, blu, viola, bianco, nero, grigio, marrone), e lo stesso vale per le altre categorie. La maggior parte delle categorie ha solo un numero limitato di opzioni, ad esempio la posizione è coperta, all'aperto o sconosciuta e la luminosità è chiara, scura o neutra.
Il mio approccio ingenuo è qualcosa del genere:
- Interrogare il database per le immagini con significato storico
- Scegli un'immagine casuale a partire dalle immagini storicamente significative
- Delle restanti immagini storiche, fai un campionamento casuale di N immagini. Valori diversi di N ci daranno più varietà a scapito dell'accuratezza.
- Per ogni immagine selezionata casualmente, crea un vettore binario ordinato per tutti i possibili valori di categoria (es. rosso = 0, blu = 1, esterno = 1, ecc.), producendo un valore binario.
- Confronta i valori binari per l'immagine di partenza e l'immagine casuale, ad esempio utilizzando un'operazione XOR bit a bit (o un'operazione di set equivalente), quindi conta il numero di 1 nel risultato.
Non sono necessariamente interessato a trovare le immagini più dissimili. Qualsiasi due immagini che sono per la maggior parte dissimili andrà bene, e in effetti di solito desideriamo un po 'di casualità, quindi le stesse coppie di immagini non sono spesso selezionate.
Questo approccio ingenuo funziona bene. Esistono algoritmi o tecniche appropriati che dovrei esaminare per questo problema?