2012-03-13 7 views
6

私はactionscriptの初心者です。私が正しく理解している場合、DisplacementMapFilterは、「MAP画像」内の対応するピクセル位置の色に従ってピクセルを「ソース画像」から移動します。DisplacementMapFilterはどのように機能しますか?

問題は、宛先イメージにソースイメージにないピクセルが含まれていることです。

例えば、私はこれのBitmapDataと単色10 * 10ピクセルの元画像」を撮る:

sourceBitmap = new BitmapData(BITMAP_WIDTH, BITMAP_HEIGHT, false, 0x000002); 

produce: 

    0 1 2 3 4 5 6 7 8 9 
[002,002,002,002,002,002,002,002,002,002] Row 0 
[002,002,002,002,002,002,002,002,002,002] Row 1 
[002,002,002,002,002,002,002,002,002,002] Row 2 
[002,002,002,002,002,002,002,002,002,002] Row 3 
[002,002,002,002,002,002,002,002,002,002] Row 4 
[002,002,002,002,002,002,002,002,002,002] Row 5 
[002,002,002,002,002,002,002,002,002,002] Row 6 
[002,002,002,002,002,002,002,002,002,002] Row 7 
[002,002,002,002,002,002,002,002,002,002] Row 8 
[002,002,002,002,002,002,002,002,002,002] Row 9 

、私はこのBLACK変位MAPを取ると、私は少し青い四角を追加します。

displacementBitmap = new BitmapData(BITMAP_WIDTH,BITMAP_HEIGHT,false,0x000000); 
for(i=5;i<10;i++) 
    for(j=5;j<10;j++) 
     displacementBitmap.setPixel(i,j,255); 

produce: 

0 1 2 3 4 5 6 7 8 9 
[000,000,000,000,000,000,000,000,000,000] Row 0 
[000,000,000,000,000,000,000,000,000,000] Row 1 
[000,000,000,000,000,000,000,000,000,000] Row 2 
[000,000,000,000,000,000,000,000,000,000] Row 3 
[000,000,000,000,000,000,000,000,000,000] Row 4 
[000,000,000,000,000,255,255,255,255,255] Row 5 
[000,000,000,000,000,255,255,255,255,255] Row 6 
[000,000,000,000,000,255,255,255,255,255] Row 7 
[000,000,000,000,000,255,255,255,255,255] Row 8 
[000,000,000,000,000,255,255,255,255,255] Row 9 

結果:

displacementFilter = new DisplacementMapFilter(); 
displacementFilter.alpha=0; 
displacementFilter.color=0; 
displacementFilter.mapPoint=new Point(0,0); 
displacementFilter.scaleX=1; 
displacementFilter.scaleY=1; 
displacementFilter.componentX = flash.display.BitmapDataChannel.BLUE; 
displacementFilter.componentY = flash.display.BitmapDataChannel.BLUE; 
displacementFilter.mapBitmap = displacementBitmap; 

destinationBitmap = new BitmapData(BITMAP_WIDTH,BITMAP_HEIGHT,false,0xFFFFFFFF); 
destinationBitmap.applyFilter(
    sourceBitmap.bitmapData, 
    new Rectangle(0,0,BITMAP_WIDTH,BITMAP_HEIGHT), 
    new Point(0,0), 
    displacementFilter 
); 

produce:   

    0 1 2 3 4 5 6 7 8 9 
[002,002,002,002,002,002,002,002,002,002] Row 0 
[002,002,002,002,002,002,002,002,002,002] Row 1 
[002,002,002,002,002,002,002,002,002,002] Row 2 
[002,002,002,002,002,002,002,002,002,002] Row 3 
[002,002,002,002,002,002,002,002,002,002] Row 4 
[002,002,002,002,002,001,001,001,001,001] Row 5 
[002,002,002,002,002,001,001,001,001,001] Row 6 
[002,002,002,002,002,001,001,001,001,001] Row 7 
[002,002,002,002,002,001,001,001,001,001] Row 8 
[002,002,002,002,002,001,001,001,001,001] Row 9 

私は存在していない「001」ピクセルを持っている理由だから私は理解していませんソースイメージ

ありがとうございました。

+0

今、私の[質問](http://stackoverflow.com/questions/9260717/displacement-map-filter-in-opencv)に恥知らずなプラグインの時間。 – karlphillip

答えて

3

変位マップフィルタはthis formulaを使用して、ソース・ビットマップからつかむためにどの画素決定:

dstPixel[x, y] = srcPixel[x + ((componentX(x, y) - 128) * scaleX)/256, y + ((componentY(x, y) - 128) *scaleY)/256) 

dstPixelsrcPixelがソースビットマップであり、componentX/Y変位ビットマップからのものである、先のビットマップです。マッピングは、コンポーネントチャネルが128からどのくらい離れているかによって決まります。128は変換がない中立値であり、同じソースピクセルが使用されます。

たとえば、(1、1)のピクセルを考えてみましょう。あなたのコンポーネントチャンネルは青で、ディスプレースメントマップの(1、1)にある青チャンネルは0の値を持ちます。したがって、(0 - 128)/ 256または-0.5で置き換えます。したがって、ソースビットマップから取得する最後のピクセルは(0.5、0.5)です。

しかし、ピクセルの半分を使用することはどういう意味ですか? Flashがbilinear filteringを使用して結果を平滑化することが判明しました。あなたは、(0,0)と(1,1)の間の4つのピクセルの色のブレンドになります。

これは、ソースイメージに含まれていない奇数ピクセルが表示される理由です。ソース画像内のすべてのピクセルが同じ色であっても、Flashが色の間を補間するときに浮動小数点の不正確さがあるように見えることがあるので、時には少しだけの値が得られます。ディスプレースメントビットマップの値を128または128など "きれいに"割った値を使用すると、正しい結果が得られます。しかし、255や19などの値を使用すると、エラーが発生します。

フィルタリングをオフにして単純な最近隣サンプリングを使用する方法はないようです。新しい色を導入しないことを保証する必要がある場合は、ディスプレースメントマップの値を慎重に選択する必要があります。

また、Pixel Benderを使用して、必要な機能を果たすカーネルを作成することもできます。 Pixel Benderでは、ソースビットマップから最近隣のサンプリングを行うことができます。

+0

パーフェクト。どうもありがとう。 –

関連する問題