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.

questionAnswers(1)

yourAnswerToTheQuestion