2013-03-20 11 views
6

Buduję aplikację korzystającą z filtru obrazu rdzenia CIAreaHistogram. Używam wartość inputCount (ilość) z dnia 10 wiader do testowania oraz wartość inputScale z 1.CIAreaHistogram inputScale factor

uzyskać CIImage dla samego wykresu, którą następnie uruchomić poprzez własne jądro (patrz koniec postu) do ustaw wartości alfa na 1 (ponieważ w przeciwnym razie wartość alfa z obliczeń histogramu zostanie wstępnie pomnożona), a następnie przekonwertuj ją na NSBitmapImageRep.

Następnie skanuję bufor przedstawiciela obrazu i drukuję wartości RGB (pomijając wartości alfa). Jednak gdy to zrobię, suma wartości R, G i B w 10 nie musi sumować się do 255.

Na przykład przy w pełni czarnym obrazie stosuję histogram, a następnie niestandardowy jądro, i pojawia się następujący komunikat:

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 

to jak ja się spodziewać, ponieważ wszystkie piksele są czarne, więc wszystko jest w pierwszym wiadrze. Jednakże, jeśli uruchomię ten sam algorytm z kolorowego obrazu, pojawia się następujący:

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 

zsumować wartości R, G i B - nie sumują się do 255. Powoduje to problemy, ponieważ Muszę porównać dwa z tych histogramów, a mój algorytm oczekuje, że sumy będą zawierać się między 0 a 255. Mogę oczywiście skalować te wartości, ale chcę uniknąć tego dodatkowego kroku ze względu na wydajność.

Zauważyłem coś jeszcze interesującego, co może dać nam pewną wskazówkę, dlaczego tak się dzieje. W moim niestandardowym jądrze po prostu ustawiłem wartość alpha na 1. Wypróbowałem drugie jądro (patrz koniec postu), które ustawia wszystkie piksele na czerwono. Oczywiście wartości zielone i niebieskie wynoszą zero. Jednak otrzymuję ten wynik podczas sprawdzania wartości z bitmapy:

RGB: 255 43 25 

Ale ja po prostu ustawię G i B na zero! To wydaje się być częścią problemu, który wskazuje zarządzanie kolorami. Ale ponieważ jawnie ustawić wartości w jądrze, jest tylko jeden blok kodu, w którym może się dziać - konwersja do NSBitmapImageRep z CIImage z filtra:

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

Raz ustawić piksele RGB 255 0 0, następnie wykonaj te linie, a następnie odczytaj bufor, wartości RGB są wszystkie 255 43 25. Próbowałem jeszcze ustawić obszar kolorów oryginalnego CGImageRef, na którym cały przepływ pracy jest oparty na kCGColorSpaceGenericRGB, myśląc, że profil kolorów może być przeprowadzanie, ale bezskutecznie.

Czy ktoś może mi powiedzieć, dlaczego jądro CIFilter zachowałoby się w ten sposób i jak mogłem go rozwiązać?

Oto wspomniane wcześniej kopie funkcji jądra CIFilter, których używam. Po pierwsze, ten, który ustawia alpha 1:

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

A obok, ten, który ustawia wszystkie piksele RGB 255 0 0, ale to kończy się 255 43 25 raz konwertuje do 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; 
} 

Z góry dziękuję za pomoc.

Odpowiedz

0

Musisz jednej linii kodu tylko do generowania i wyświetlania histogramu przy użyciu niestandardowego Filtr rdzeniowy zdjęcie (lub gdy tworzysz nowy obiekt CIImage lub wymieniasz istniejący):

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