2013-03-20 16 views
6

Sto costruendo un'applicazione che utilizza il filtro Image Core CIAreaHistogram. Utilizzo un valore inputCount (numero di bucket) 10 per il test, e un valore di 1. inputScaleCIAreaHistogram inputScale factor

ottengo il CIImage per l'istogramma stesso, che poi eseguito attraverso un kernel personalizzato (vedi fine del post) per impostare i valori alfa su 1 (poiché altrimenti il ​​valore alfa dai calcoli dell'istogramma è premoltiplicato) e quindi convertirlo in un NSBitmapImageRep.

Quindi analizzo il buffer del file immagine e stampo i valori RGB (saltando i valori alfa). Tuttavia, quando faccio questo, la somma dei valori R, G e B su 10 non necessariamente somma fino a 255.

Ad esempio, con un'immagine completamente nera, applico l'istogramma, quindi l'abitudine kernel, e di ottenere il seguente output:

RGB: 255 255 255 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 

Questo è come mi aspetto, dal momento che tutti i pixel sono neri, quindi tutto è in primo secchio. Tuttavia, se corro lo stesso algoritmo un'immagine a colori con, ottengo il seguente:

RGB: 98 76 81 
RGB: 164 97 87 
RGB: 136 161 69 
RGB: 100 156 135 
RGB: 80 85 185 
RGB: 43 34 45 
RGB: 31 19 8 
RGB: 19 7 3 
RGB: 12 5 2 
RGB: 16 11 11 

Sommare i valori per R, G e B - non aggiungono fino a 255. Questo provoca problemi perché Ho bisogno di confrontare due di questi istogrammi, e il mio algoritmo si aspetta che le somme siano tra 0 e 255. Potrei ovviamente scalare questi valori, ma voglio evitare quel passo in più per motivi di prestazioni.

Ho notato qualcos'altro di interessante che potrebbe dare qualche indizio sul perché questo sta accadendo. Nel mio kernel personalizzato, ho semplicemente impostato il valore alpha su 1. Ho provato un secondo kernel (vedi fine del post) che imposta tutti i pixel in rosso. Chiaramente, i valori verdi e blu sono zero. Tuttavia, ottengo questo risultato durante il controllo i valori dal rappresentante bitmap:

RGB: 255 43 25 

Ma ho appena impostato G e B a zero! Questo sembra essere parte del problema, che indica la gestione del colore. Ma dal momento che in modo esplicito impostare i valori nel kernel, c'è solo un blocco di codice in cui questo può accadere - la conversione a un NSBitmapImageRep dal CIImage dal filtro:

NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCIImage:kernelOutput]; 
unsigned char *buf = [bitmapRep bitmapData]; 

Una volta che ho impostato i pixel in RGB 255 0 0, quindi esegui quelle linee, quindi leggi il buffer, i valori RGB sono tutti 255 43 25. Ho anche provato a impostare lo spazio colore del CGImageRef originale su cui si basa l'intero flusso di lavoro su kCGColorSpaceGenericRGB, pensando che il profilo del colore potrebbe essere portando avanti, ma senza successo.

Qualcuno può dirmi perché un kernel CIFilter si comporta in questo modo e come posso risolverlo?

Come accennato in precedenza, ecco le copie delle funzioni del kernel CIFilter che utilizzo. In primo luogo, quella che imposta alpha a 1:

kernel vec4 adjustHistogram(sampler src) 
{ 
    vec4 pix = sample(src, destCoord()); 
    pix.a = 1.0; 
    return pix; 
} 

E accanto, quella che imposta tutti i pixel a RGB 255 0 0 ma che finisce 255 43 25 una volta che converte in NSBitmapImageRep:

kernel vec4 adjustHistogram(sampler src) 
{ 
    vec4 pix = sample(src, destCoord()); 
    pix.r = 1.0; pix.g = 0.0; pix.b = 0.0; 
    pix.a = 1.0; 
    return pix; 
} 

Grazie in anticipo per il vostro aiuto.

risposta

0

Hai solo bisogno di una riga di codice per generare e visualizzare un istogramma quando si utilizza un filtro Core Image personalizzato (o ogni volta che si crea un nuovo oggetto CIImage o si sostituisce uno esistente):

return [CIFilter filterWithName:@"CIHistogramDisplayFilter" keysAndValues:kCIInputImageKey, self.inputImage, @"inputHeight", @100.0, @"inputHighLimit", @1.0, @"inputLowLimit", @0.0, nil].outputImage; 
Problemi correlati