CIAreaHistogram inputScale factor

Ich erstelle eine Anwendung, die das verwendetCIAreaHistogram Core Image Filter. Ich benutze eineinputCount Wert (Anzahl der Eimer) von 10 zum Testen und aninputScale Wert von 1.

Ich bekomme dieCIImage für das Histogramm selbst, das ich dann durch einen benutzerdefinierten Kernel (siehe Ende des Beitrags) laufen lasse, um Alpha-Werte auf 1 zu setzen (da sonst der Alpha-Wert aus den Histogramm-Berechnungen vorvervielfacht wird) und es dann in ein umzuwandelnNSBitmapImageRep.

Ich scanne dann durch den Puffer des Bildwiederholers und drucke die RGB-Werte (überspringe die Alpha-Werte). Wenn ich dies jedoch tue, addiert sich die Summe der Werte R, G und B über die 10 nicht unbedingt zu 255.

Bei einem vollständig schwarzen Bild wende ich beispielsweise zuerst das Histogramm und dann den benutzerdefinierten Kernel an und erhalte die folgende Ausgabe:

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

Dies ist, wie ich es erwarte, da alle Pixel schwarz sind, alles im ersten Bucket. Wenn ich jedoch denselben Algorithmus mit einem Farbbild ausführe, erhalte ich Folgendes:

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

Addieren Sie die Werte für R, G und B - sie addieren sich nicht zu 255. Dies verursacht Probleme, da ich zwei dieser Histogramme vergleichen muss und mein Algorithmus erwartet, dass die Summen zwischen 0 und 255 liegen Skalieren Sie diese Werte, aber ich möchte diesen zusätzlichen Schritt aus Leistungsgründen vermeiden.

Mir ist etwas anderes Interessantes aufgefallen, das möglicherweise einen Hinweis darauf gibt, warum dies geschieht. In meinem benutzerdefinierten Kernel habe ich einfach den Alpha-Wert auf 1 gesetzt. Ich habe einen zweiten Kernel (siehe Ende des Beitrags) ausprobiert, der alle Pixel auf Rot setzt. Es ist klar, dass die Werte für Grün und Blau Null sind. Dieses Ergebnis erhalte ich jedoch, wenn ich die Werte aus dem Bitmap-Repräsentanten überprüfe:

RGB: 255 43 25

Aber ich habe gerade G und B auf Null gesetzt! Dies scheint Teil des Problems zu sein, das auf ein Farbmanagement hinweist. Aber da ich die Werte im Kernel explizit festgelegt habe, gibt es nur einen Codeblock, in dem dies passieren kann - die Konvertierung in ein NSBitmapImageRep aus dem CIImage aus dem Filter:

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

Sobald ich die Pixel auf RGB 255 0 0 eingestellt, dann diese Zeilen ausgeführt und dann den Puffer gelesen habe, sind die RGB-Werte alle 255 43 25. Ich habe weiter versucht, den Farbraum des ursprünglichen CGImageRef festzulegen, auf dem der gesamte Workflow basiertkCGColorSpaceGenericRGBund dachte, das Farbprofil könnte sich durchsetzen, aber ohne Erfolg.

Kann mir jemand sagen warum aCIFilter Kernel würde sich so verhalten und wie könnte ich das lösen?

Wie bereits erwähnt, sind hier Kopien der CIFilter-Kernelfunktionen, die ich verwende. Erstens, derjenige, der alpha auf 1 setzt:

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

Und als nächstes das, das alle Pixel auf RGB 255 0 0 setzt, aber nach der Konvertierung in 255 43 25 endetNSBitmapImageRep:

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;
}

Vielen Dank im Voraus für Ihre Hilfe.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage