2012-06-16 11 views
9

Sembra che Adobe Photoshop effettui la posterizzazione mediante la quantizzazione di ciascun canale di colore separatamente, in base al numero di livelli specificati. Quindi, per esempio, se si specificano 2 livelli, allora prenderà il valore R e lo imposterà su 0 se il valore R è inferiore a 128 o 255 se il valore è> = 128. Farà lo stesso per G e BPosterizzazione in stile Adobe Photoshop e OpenCV

Esiste un modo efficace per farlo in Python con OpenCV oltre a scorrere ogni pixel e effettuare il confronto e impostare il valore separatamente? Dato che un'immagine in OpenCV 2.4 è un narray NumPy, c'è forse un modo efficace per eseguire questo calcolo rigorosamente attraverso NumPy?

+1

Ciao, ha aggiunto una risposta generalizzata per tutti i livelli . –

risposta

7

Possiamo farlo in modo abbastanza ordinato usando Numpy, senza doverci preoccupare dei canali!

import cv2 
im = cv2.imread('1_tree_small.jpg') 
im[im >= 128]= 255 
im[im < 128] = 0 
cv2.imwrite('out.jpg', im) 

uscita:

enter image description here

ingresso:

enter image description here

+0

wow incredibile, grazie! Sono un novizio completo con Numpy, non avevo capito che era così potente, ho intenzione di dover esaminare in profondità! Grazie ancora! – steve8918

7

La tua domanda sembra specificamente per essere chiedendo un livello di 2. Ma per quanto riguarda i livelli di più di 2. Così ho aggiunto un codice qui sotto che può posterizzare per qualsiasi livello di colore.

import numpy as np 
import cv2 

im = cv2.imread('messi5.jpg') 

n = 2 # Number of levels of quantization 

indices = np.arange(0,256) # List of all colors 

divider = np.linspace(0,255,n+1)[1] # we get a divider 

quantiz = np.int0(np.linspace(0,255,n)) # we get quantization colors 

color_levels = np.clip(np.int0(indices/divider),0,n-1) # color levels 0,1,2.. 

palette = quantiz[color_levels] # Creating the palette 

im2 = palette[im] # Applying palette on image 

im2 = cv2.convertScaleAbs(im2) # Converting image back to uint8 

cv2.imshow('im2',im2) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Questo codice utilizza un metodo chiamato metodo tavolozza in Numpy che è veramente veloce rispetto scorrendo i pixel. Potete trovare maggiori dettagli come può essere utilizzato per accelerare il codice qui: Fast Array Manipulation in Numpy

Di seguito sono riportati i risultati che ho ottenuto per diversi livelli:

Immagine originale:

enter image description here

Livello 2:

enter image description here

Livello 4:

enter image description here

Livello 8:

enter image description here

E così via ...

+0

Sto cercando di convertire questo in C++, come posso quantizzare i colori – AHF

+1

prima di trovare un numero tra i livelli. Ad esempio, se 2 livelli, prendi 127 per dividere i colori. Quindi tutti i colori diventano 0 e 1. Se 3 livelli, prendi circa 85 e così via. Quindi la divisione darà 0,1,2. Quindi li espandi a 0,127, 255 ecc. –