2015-04-20 11 views
6

Vorrei estrarre un singolo colore (ad esempio # a87830) da un'immagine, cambiando ogni altro colore in bianco. L'input può essere un po 'rumoroso, pertanto è possibile includere adiacenti a pixel di un colore simile. Idealmente tutti i pixel non bianchi alla fine verrebbero convertiti in nero (ad esempio, l'output è un'immagine con profondità di 1 bit).Rimuovi tutto tranne un colore da un'immagine (riga di comando o codice)

Potrei volerlo processare in questo modo, quindi spero in qualcosa come una linea di comando imagemagick, o qualcosa che potrei programmare usando l'estensione imagemagick di PHP. (Sono sicuro che ImageMagick deve essere in grado di farlo, se i parametri giusti possono essere risolti, motivo per cui l'ho taggato, ma sono aperto ad altri software, purché funzioni su Linux.)

Background: io sto cercando di fare la prima fase di pre-elaborazione per il programma ContourTrace, che è ben dimostrato da questa immagine:

enter image description here

risposta

7

Qui è uno da provare:

convert        \ 
    http://i.stack.imgur.com/rK259.png \ 
-fuzz 33%       \ 
-fill black       \ 
-opaque "#A87830"     \ 
-threshold 12%      \ 
    black+white.png 

Il parametro -fuzz rende tutti i colori match che si trovano a una certa vicinanza del colore definito da -opaque. No -fuzz e corrisponderai solo a questi pixel, che sono esattamente "#A87830".

Il -threshold converte i pixel a colori in bianco o nero, dove la percentuale definisce il limite: in alto diventa nero, in basso diventa bianco.

black+white.png

È possibile modificare il comando -opaque "<color-definition>"-+opaque "<color-definition>" a invertito il significato della selezione di colore: sarà sostituire i pixel che non sono di questo colore (questa volta ho saltare il parametro -threshold in ordine per mantenere i colori):

convert        \ 
    http://i.stack.imgur.com/rK259.png \ 
-fuzz 33%       \ 
-fill black       \ 
+opaque "#FFFFFF"     \ 
    other.png 

other.png

+0

Aha! Cambiare da '-opaque' a' + opaque' dà quasi quello che voglio (il bianco e il nero sono nella direzione sbagliata, ma penso che persino il mio skillz ImageMagick può ordinarlo ...) –

9

Non sono sicuro se questo è abbastanza sofisticato per voi. Converti tutti i pixel simili, entro il 30% del colore dichiarato, in nero e poi fai il resto bianco.

convert in.png -fuzz 30% -fill black -opaque "#a87830" -threshold 10% out.png 

enter image description here

È possibile "aggiungere" più toni che si desidera diventare nero con l'aggiunta di ulteriori -opaque comandi, come questo

convert in.jpg -fuzz 20% -fill black \ 
    -opaque "#a87830"     \ 
    -opaque "#a6725f"     \ 
    -threshold 1% out.png 

che può consentire di diminuire il fuzz e quindi rimuovere altri toni che non si desidera.

+0

Grazie! Quali sono i diversi significati del 30% e del 10% nella tua linea di comando? Speravo che ci fosse qualcosa con il significato di "consentire un colore simile ma solo se adiacente a un pixel del colore target". Ciò consentirebbe la confusione jpeg/scanner, ma non includerebbe le linee nere e viola del tuo esempio. –

+0

Il 30% significa * "seleziona i pixel entro il 30% in termini di distanza del colore" * dal valore di 'a87830'.La soglia al 10% significa che tutti i pixel vengono impostati con vack RGB inferiori a 25,25,25 (ossia il 10% di 255) in nero e tutti quelli sopra questo valore in bianco. Quindi l'immagine di output sarà in bianco e nero puro. –

+0

Ho notato che anche se riduco sia fuzz che soglia all'1%, ottengo ancora tutte le linee nere dall'originale. (Solo le linee marroni dovrebbero essere mantenute, quindi le linee nere dovrebbero andare in bianco proprio come qualsiasi altra cosa.) –

Problemi correlati