8

CIAreaHistogramCore Image フィルターを使用するアプリケーションを構築しています。inputCountテストには 10 の値 (バケット数)を使用し、1 の値を使用しますinputScale

CIImageはヒストグラム自体NSBitmapImageRep

次に、イメージ担当者のバッファーをスキャンし、RGB 値を出力します (アルファ値をスキップします)。ただし、これを行うと、10 の R、G、および B 値の合計が必ずしも 255 になるとは限りません。

たとえば、完全に黒の画像で、ヒストグラムを適用してからカスタム カーネルを適用すると、次の出力が得られます。

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

すべてのピクセルが黒であるため、すべてが最初のバケットにあるため、これは予想どおりです。ただし、カラー画像で同じアルゴリズムを実行すると、次のようになります。

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

R、G、および B の値を合計します - これらの合計は 255 になりません。これらのヒストグラムのうちの 2 つを比較する必要があり、私のアルゴリズムは合計が 0 から 255 の間であると想定しているため、これは問題を引き起こします。これらの値をスケーリングしますが、パフォーマンス上の理由から、その余分な手順は避けたいと考えています。

なぜこれが起こっているのかについての手がかりを与えるかもしれない別の興味深いことに気付きました. 私のカスタム カーネルでは、単純にアルファ値を 1 に設定しました。すべてのピクセルを赤に設定する 2 つ目のカーネル (記事の最後を参照) を試しました。明らかに、緑と青の値はゼロです。ただし、ビットマップ担当者から値を確認すると、次の結果が得られます。

RGB: 255 43 25

しかし、G と B をゼロに設定しただけです。これは、カラー マネージメントを示す問題の一部のようです。しかし、カーネルで値を明示的に設定したため、これが発生する可能性のあるコード ブロックは 1 つだけです。フィルターからの CIImage から NSBitmapImageRep への変換です。

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

ピクセルを RGB 255 0 0 に設定し、それらの行を実行してからバッファを読み取ると、RGB 値はすべて 255 43 25 になります。さらに、ワークフロー全体のベースとなる元の CGImageRef の色空間を設定してみました。kCGColorSpaceGenericRGB、カラープロファイルが引き継がれている可能性があると考えていますが、役に立ちません。

CIFilterカーネルがこのように動作する理由と、それを解決する方法を誰か教えてもらえますか?

前述のとおり、ここに私が使用する CIFilter カーネル関数のコピーを示します。まず、アルファを 1 に設定するもの:

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

次に、すべてのピクセルを RGB 255 0 0 に設定しますが、変換すると 255 43 25 になり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;
}

よろしくお願いします。

4

1 に答える 1