Domanda

Sto lavorando su un sito web immobiliare e mi piacerebbe scrivere un programma che riesce a capire (classificare) se un'immagine è una pianta o di un logo aziendale.

Dal momento che sto scrivendo in php Io preferisco una soluzione php ma qualsiasi C ++ o una soluzione OpenCV andrà bene così.

Piano Piano campione:

alt text http://www.rentingtime.com/uploads /listing/l0050/0000050930/68614.jpg

alt text http://www.rentingtime.com/uploads /listing/l0031/0000031701/44199.jpg

Logo del campione:

alt text http://www.rentingtime.com/uploads /listing/l0091/0000091285/95205.jpg

È stato utile?

Soluzione

Come sempre, c'è un built-in funzione PHP per questo . Solo scherzando. =)

Tutte le planimetrie che ho visto sono abbastanza monocromatico, penso che si può giocare con il numero di colori e la saturazione dei colori per avere una buona ipotesi è l'immagine è un logo o una planimetria.

Es .: is the image has less than 2 or 3 colors is a floor plan.

Es .: if the sum / average of the saturation is less than X it's a floor plan.

(colori simili e altri che sono utilizzati in planimetrie) bianco e nero hanno una saturazione che è zero, o molto vicino a zero, mentre loghi tendono ad essere più visivamente attraente, quindi usare i colori più saturi.

Ecco una semplice funzione per calcolare la saturazione di un colore RGB Hex:

function Saturation($color)
{
    $color = array_map('hexdec', str_split($color, 2));

    if (max($color) > 0)
    {
        return (max($color) - min($color)) / max($color);
    }

    return 0;
}

var_dump(Saturation('000000')); // black    0.0000000000000000
var_dump(Saturation('FFFFFF')); // white    0.0000000000000000
var_dump(Saturation('818185')); // grey     0.0300751879699249
var_dump(Saturation('5B9058')); // green    0.3888888888888889
var_dump(Saturation('DE1C5F')); // pink     0.8738738738738738
var_dump(Saturation('FE7A15')); // orange   0.9173228346456692
var_dump(Saturation('FF0000')); // red      1.0000000000000000
var_dump(Saturation('80FF80')); // ---      0.4980392156862745
var_dump(Saturation('000080')); // ---      1.0000000000000000

imagecolorat () e imagecolorsforindex () è possibile implementare una semplice funzione che loop trogolo tutti i pixel dell'immagine e somme / calcola la media della saturazione. Se l'immagine ha un livello di saturazione al di sopra di una soglia personalizzato definire si può supporre che l'immagine è un logo.

Una cosa che non si deve dimenticare è che le immagini che hanno una risoluzione più alta, di norma hanno più di saturazione (più pixel per riassumere), quindi per il bene di questo algoritmo e anche per il bene della vostra prestazioni del server sarebbe saggio per ridimensionare tutte le immagini ad una risoluzione comune (per esempio 100x100 o 50x50) classificarli e, una volta classificato è possibile utilizzare l'originale (non ridimensionato) immagini.

Ho fatto un semplice test con le immagini che hai fornito, ecco il codice che ho usato:

$images = array('./44199.jpg', './68614.jpg', './95205.jpg', './logo.png', './logo.gif');

foreach ($images as $image)
{
    $sat = 0;
    $image = ImageCreateFromString(file_get_contents($image));

    for ($x = 0; $x < ImageSX($image); $x++)
    {
        for ($y = 0; $y < ImageSY($image); $y++)
        {
            $color = ImageColorsForIndex($image, ImageColorAt($image, $x, $y));

            if (is_array($color) === true)
            {
                $sat += Saturation(dechex($color['red']) . dechex($color['green']) . dechex($color['blue']));
            }
        }
    }

    echo ($sat / (ImageSX($image) * ImageSY($image)));
    echo '<hr />';
}

Ed ecco i risultati:

green floor plant:      0.0151028053
black floor plant:      0.0000278867
black and white logo:   0.1245559912
stackoverflow logo:     0.0399864136
google logo:            0.1259357324

Utilizzando solo questi esempi, direi che l'immagine è una pianta pavimento, se la saturazione media è inferiore a 0,03 o 0,035, è possibile modificare un po 'più con l'aggiunta di esempi in più.

Altri suggerimenti

Può essere più facile di esternalizzare questo per l'uomo.

Se avete un budget, si consideri di Amazon Mechanical Turk . Vedi Wikipedia per un descrizione generale .

In alternativa, si potrebbe fare l'outsourcing da soli. Scrivi uno script PHP per visualizzare un'immagine e richiedere all'utente di ordinare che sia come un "logo" nostro "planimetria". Una volta che avete questo correre su un server web, email il vostro intero ufficio e chiedere a tutti di ordinare 20 immagini come favore personale.

Meglio ancora, ne fanno un contest-- la persona che ordina il maggior numero di immagini vincerà un iPod!

Forse la cosa più semplice, invitare tutti quelli che conosci sopra per pizza e birra e la configurazione di un gruppo di computer portatili e ottenere a tutti di passare qualche minuto di ordinamento.

Ci sono modi di software per realizzare il vostro compito, ma se si tratta di un evento una tantum con meno di qualche migliaio di immagini e un budget di almeno qualche centinaio di dollari, rispetto penso che la tua vita può essere più facile con gli esseri umani.

Una delle prime cose che viene in mente è il fatto che i programmi di pavimento tendono ad avere molti più linee orientate a 90 gradi rispetto a qualsiasi logo normale avrebbe fatto.

Un primo passaggio veloce sarebbe quello di eseguire Algoritmo di Canny sull'immagine e votare gli angoli utilizzando un trasformata di Hough e la definizione rho, Theta di una linea. Se si vede una forte corrispondenza per Theta = (0, 90, 180, 270) cumulativamente su rho, è possibile classificare l'immagine come una pianta.

Un'altra opzione sarebbe quella di camminare l'immagine bordo dopo la fase Canny solo contare i voti da lunghi e segmenti continui, rimozione del rumore.

dubito fortemente tale strumento esiste già, e la creazione di qualcosa di preciso sarebbe non banale. Se la vostra necessità è quella di risolvere una serie di immagini già esistenti (ad esempio, si dispone di una directory non ordinato), allora si potrebbe essere in grado di scrivere un "abbastanza buono" strumento e manualmente gestire i fallimenti. Se avete bisogno di fare questo in modo dinamico con nuove immagini, è probabilmente l'approccio sbagliato.

Se dovessi tentare questo per il primo caso, avrei probabilmente cercare qualcosa di diverso banalmente posso usare come proxy. Sono planimetrie in genere molto più grande allora loghi (in entrambe le dimensioni del file o le dimensioni delle immagini)? Non planimetrie hanno meno colori poi un logo? Se posso ottenere il 75% di precisione con qualcosa di banale, è probabilmente la strada da percorrere.

cose come questa - recoginition di modelli nelle immagini -. Tende ad essere particolarmente costosa in termini di tempo, orribilmente inaffidabile e in costante bisogno di aggiornamento e patch per abbinare nuovi casi

Si può sapere perché avete bisogno di fare questo? Non c'è un punto nel flusso di lavoro del tuo sito web, dove è stato possibile determinare manualmente se un'immagine è un logo o una pianta? Non sarebbe più facile scrivere un programma che permette agli utenti di determinare che è che al momento del caricamento? Perché c'è un insieme misto di dati in primo luogo?

Nonostante pensando che questa è una cosa che richiede un intervento manuale, una cosa che si potrebbe fare è controllare la dimensione dell'immagine.

Un'immagine di piccole dimensioni (sia in termini di MB e le dimensioni) è probabile che sia un logo.

Un'immagine di grandi dimensioni (sia in termini di MB e le dimensioni) è probabile che sia una planimetria.

Tuttavia, questo sarebbe solo una misura di probabilità e in nessun modo infallibile.

Il tipo di immagine è anche un indicatore, ma meno di uno. Loghi sono più probabilità di essere JPG, PNG o GIF, planimetrie sono forse andando essere altro formato senza perdita di dati TIFF o - ma questo è alcuna garanzia

.

Un semplice tentativo gioco da ragazzi avrei primo tentativo sarebbe quella di utilizzare SVM per imparare i punti chiave SIFT ottenuti dai campioni. Ma prima di poter fare ciò, è necessario etichettare un piccolo sottoinsieme delle immagini, dandogli sia -1 (una pianta) o 1 (un logo). se un'immagine ha più punti chiave classificate come una planimetria allora deve essere una planimetria, se ha più punti chiave classificate come un logo allora deve essere un logo. In Computer Vision, questo è noto come l'approccio borsa-di-caratteristiche, anche uno dei metodi più semplici intorno. Metodi più complessi probabilmente danno i risultati migliori, ma questo è un buon inizio.

Come altri hanno detto, ad esempio il riconoscimento delle immagini è di solito terribilmente complessa. Dimenticate PHP.

Tuttavia, guardando oltre i vostri campioni vedo un criterio che potrebbe il lavoro abbastanza bene e sarebbe piuttosto facile da implementare, se lo ha fatto:

Esegui l'immagine attraverso un buon OCR, vedere che cosa le stringhe pop. Se si trova un mucchio di parole che descrivono le camere o tali caratteristiche ...

Mi piacerebbe ruotare l'immagine di 90 gradi e provare di nuovo a prendere le etichette verticali.

Modifica: Dal momento che si dice che si provato e non funziona forse è necessario pulire il disordine prima. Tagliate l'immagine verso l'alto sulla base di spazi bianchi. Eseguire l'OCR contro ogni sotto-immagine nel caso in cui si sta facendo incasinato cercando di analizzare le linee. Si potrebbe verificare questa manualmente utilizzando un editor di immagini per affettare in su.

Utilizzare sia la saturazione del colore e dimensioni dell'immagine (sia suggerito separatamente nelle risposte precedenti). Utilizzare un ampio campione di figure umane-classificato e vedere come si tramano in 2-D spazio (dimensioni x saturazione) poi decidere dove mettere il confine. Le esigenze di confine non essere una linea retta, ma non fanno troppi colpi di scena cercando di rendere tutti i puntini si adattano, o sarai "memoryzing" il campione a scapito di nuovi dati. Meglio trovare un relativamente semplice confine che misura la maggior parte dei campioni, e dovrebbe adattarsi alla maggior parte dei dati.

Si deve tollerare un certo errore. Una soluzione infallibile per questo è impossibile. Che cosa succede se scelgo una planimetria come il logo della mia azienda? (Questo non è uno scherzo, succede solo per essere divertente)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top