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.