Współczynnik wprowadzania CIAreaHistogram
Buduję aplikację, która używaCIAreaHistogram
Filtr obrazu rdzenia. UżywaminputCount
wartość (liczba łyżek) 10 do testowania i aninputScale
wartość 1.
DostajęCIImage
dla samego histogramu, który następnie uruchamiam przez niestandardowe jądro (patrz koniec postu), aby ustawić wartości alfa na 1 (ponieważ inaczej wartość alfa z obliczeń histogramu jest wstępnie obliczona), a następnie przekonwertować ją naNSBitmapImageRep
.
Następnie skanuję bufor repozytorium obrazu i drukuję wartości RGB (pomijając wartości alfa). Jednak kiedy to robię, suma wartości R, G i B w 10 niekoniecznie sumuje się do 255.
Na przykład z całkowicie czarnym obrazem stosuję histogram, a następnie niestandardowe jądro i otrzymuję następujące dane wyjściowe:
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
Jest tak, jak oczekuję, ponieważ wszystkie piksele są czarne, więc wszystko jest w pierwszym wiadrze. Jeśli jednak uruchomię ten sam algorytm z kolorowym obrazem, otrzymam następujące informacje:
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
Dodaj wartości dla 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ą między 0 a 255. Mogłem oczywiście skaluj te wartości, ale chcę uniknąć tego dodatkowego kroku ze względu na wydajność.
Zauważyłem coś ciekawego, co może dać jakąś wskazówkę, dlaczego tak się dzieje. W moim własnym jądrze po prostu ustawiam wartość alpha na 1. Próbowałem drugiego jądra (patrz koniec postu), który ustawia wszystkie piksele na czerwone. Jasne jest, że wartości zielone i niebieskie wynoszą zero. Jednak otrzymuję ten wynik podczas sprawdzania wartości z repozytorium bitmapy:
RGB: 255 43 25
Ale ustawiłem G i B na zero! To wydaje się być częścią problemu, który wskazuje na zarządzanie kolorami. Ale ponieważ jawnie ustawiam wartości w jądrze, jest tylko jeden blok kodu, w którym może się to zdarzyć - konwersja na NSBitmapImageRep z CIImage z filtru:
NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCIImage:kernelOutput];
unsigned char *buf = [bitmapRep bitmapData];
Gdy ustawię piksele na RGB 255 0 0, a następnie wykonam te linie, a następnie odczytam bufor, wartości RGB są wszystkie 255 43 25. Próbowałem jeszcze ustawić przestrzeń kolorów oryginalnego CGImageRef, na którym opiera się cały przepływ pracykCGColorSpaceGenericRGB
, myśląc, że profil kolorów może się nieść, ale bezskutecznie.
Czy ktoś może mi powiedzieć, dlaczego aCIFilter
jądro będzie się zachowywać w ten sposób i jak mogę go rozwiązać?
Jak wspomniano wcześniej, oto kopie używanych przeze mnie funkcji jądra CIFilter. Po pierwsze ten, który ustawia alfa na 1:
kernel vec4 adjustHistogram(sampler src)
{
vec4 pix = sample(src, destCoord());
pix.a = 1.0;
return pix;
}
A potem ten, który ustawia wszystkie piksele na RGB 255 0 0, ale kończy się 255 43 25 po konwersji naNSBitmapImageRep
:
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ękuje za twoją pomoc.