2012-03-13 25 views
6

मैं एक्शनस्क्रिप्ट में एक नौसिखिया हूं। अगर मैं सही ढंग से समझता हूं, तो DisplacementMapFilter 'एमएपी छवि' में संबंधित पिक्सेल स्थिति के रंग के अनुसार 'स्रोत छवि' से पिक्सल चलाता है।विस्थापन मैपफ़िल्टर कैसे काम करता है?

समस्या यह है कि मेरी गंतव्य छवि में पिक्सल हैं जो स्रोत छवि में नहीं हैं!

उदाहरण के लिए, मैं इस BitmapData के साथ एक unicolor 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 

अब, मैं इस काले विस्थापन नक्शे लेने के लिए और मैं एक छोटे से नीले वर्ग जोड़ें:

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) 

dstPixel गंतव्य बिटमैप है, srcPixel स्रोत बिटमैप है, और componentX/Y विस्थापन बिटमैप से है। मानचित्रण यह निर्धारित करता है कि घटक चैनल 128 से कितना दूर है। ध्यान दें कि 128 तटस्थ मूल्य है जहां कोई परिवर्तन नहीं है, और उसी स्रोत पिक्सेल का उपयोग किया जाता है।

उदाहरण के लिए, चलिए आपके मामले में पिक्सेल (1, 1) पर विचार करें। आपका घटक चैनल नीला है, और विस्थापन मानचित्र में (1, 1) पर नीला चैनल 0 का मान है। इसलिए हम (0 - 128)/256, या -0.5 से विस्थापन करते हैं। तो स्रोत बिटमैप से हम जो अंतिम पिक्सेल पकड़ते हैं वह 0.5 (0.5, 0.5) है।

लेकिन आधा पिक्सेल का उपयोग करने का क्या अर्थ है? यह पता चला है कि परिणाम परिणामों को सुगम बनाने के लिए फ्लैश bilinear filtering का उपयोग करता है। आप (0,0) और (1,1) के बीच चार पिक्सल में रंगों के मिश्रण के साथ समाप्त होते हैं।

यही कारण है कि आप अजीब पिक्सल देख रहे हैं जो स्रोत छवि में नहीं हैं। भले ही आपकी स्रोत छवि में सभी पिक्सल एक ही रंग हैं, फिर भी फ्लैश के बीच फ्लैश होने पर कुछ फ़्लोटिंग-पॉइंट त्रुटियां होती हैं, इसलिए कभी-कभी आपको एक मान मिलता है जो थोड़ा बंद है। ध्यान दें कि यदि आप अपने विस्थापन बिटमैप में एक मान का उपयोग करते हैं जो 128 या "64" जैसे "साफ" को विभाजित करता है, तो आपको सही परिणाम मिल जाता है। लेकिन यदि आप 255 या 1 9 जैसे मान का उपयोग करते हैं, तो आपको कुछ त्रुटि मिलती है।

दुर्भाग्यवश, फ़िल्टरिंग को बंद करने और सरल निकटतम पड़ोसी नमूनाकरण का उपयोग करने का कोई तरीका नहीं प्रतीत होता है। इसलिए यदि आपको यह गारंटी देने की आवश्यकता है कि कोई नया रंग पेश नहीं किया गया है, तो आपको सावधानीपूर्वक अपने विस्थापन मानचित्र में मानों का चयन करना होगा।

वैकल्पिक रूप से, आप कर्नेल बनाने के लिए Pixel Bender का उपयोग कर सकते हैं जो आपको चाहिए। पिक्सेल बेंडर आपको स्रोत बिटमैप से निकटतम पड़ोसी नमूना करने की अनुमति देता है।

+0

बिल्कुल सही। बहुत धन्यवाद। –