2016-07-22 7 views
0

カーネルルーチンルールのドキュメントでは、 'カーネルルーチンは、入力画像の対応するピクセルに逆マッピングを使用して出力ピクセルを計算します。このようにして、ほとんどのピクセル計算を他のものより自然に表現することはできますが、不可能ではないにしても、これを困難にする画像処理操作がいくつかあります。例えば、ヒストグラムを計算することは、ソース画像への逆マッピングとして記述することは困難である。CoreImage用のヒストグラムのようなカーネルフィルタを作成するにはどうすればよいですか?

しかし、リンゴは明らかにそれを行うCIAreaHistogram Core Image Filterを持っているので何とかしています。

私は与えられた制限でそれを行うには1個の理論的な方法を見ることができます:

あなたは256要素の赤チャンネルのヒストグラムを望んでいたとしましょう...

をあなたは256x1画素出力イメージを持っています。カーネル関数は、これらの256ピクセルのそれぞれに対して呼び出されます。カーネル関数は、呼び出されるたびに、そのピクセルの赤い値がそのバケットと一致しているかどうかをチェックし、カウンタをインクリメントする毎に、全画像内のすべてのピクセルを読み取る必要があります。その出力ピクセルの画像全体のすべてのピクセルで処理されると、ピクセルの総数で除算され、その出力ピクセル値がその計算された値に設定されます。問題は、それが実際に動作すると仮定すると、すべての入力ピクセルが256回アクセスされるため、これはひどく非効率的ですが、すべての出力ピクセルは1回だけ書き込まれます。

カーネルがすべてのINPUTピクセルに対して反復処理を行い、その値に基づいて出力ピクセルを更新する方法が最適な方法です。次に、入力ピクセルはそれぞれ1回だけ読み取られ、出力ピクセルは合計(入力幅)x(入力高さ)倍の合計で読み書きされる。

誰もこの種のフィルタを動作させる方法を知っていますか?明らかに、ヒストグラムを作成するためにリンゴから利用可能なフィルタがありますが、ヒストグラムのより限定された形式を行うために必要です。 (例えば、青いヒストグラムは、ある範囲内の赤い値を持つサンプルに限定されます)。

答えて

1

この問題は、Core Imageのカスタムカーネルコードが画素ごとに再マップする機能のように機能することが原因です。現在計算しているピクセルを除いて、実際には大量の情報はありません。カスタムコアイメージフィルタは、一種のあなたは、文字通りそのCustomKernel以外の新しいイメージを制御することはできませんので、それは、カスタムカーネルを経由して、独自のヒストグラムを作るために本当に説得力のない、だから、実際にこの

for i in 1 ... image.width 
    for j in 1 ... image.height 
     New_Image[i][j] = CustomKernel(Current_Image[i][j]) 
    end 
end 

のようになります機能が作成されました。これは実際にはCIImageProcessorがiOS10用に作成された理由の1つです。その機能を使ってヒストグラムを作成しやすくなります(イメージ処理による他のクールな影響も出ます)。WWDC 2016ビデオをチェックアウトすることをお勧めします(生画像とライブ画像セッション)。

IIRC実際にヒストグラムを作成したい場合は、それでも可能ですが、UIImageのバージョンで作業し、結果のイメージをカウントできるRBGイメージに変換する必要があります。それらをビンに格納する。 Simon Gladmanの書籍にはヒストグラムの章があるので、これをお勧めしますが、フレームワークを使用するよりもイメージのコントロールがずっと多いので、コアのイメージのデフォルトバージョンにはさらに多くのものがあります。

関連する問題