2012-03-13 61 views
6

Tôi là người mới bắt đầu trong ActionScript. Nếu tôi hiểu chính xác, DisplacementMapFilter sẽ di chuyển các pixel từ 'hình ảnh nguồn' theo màu của vị trí pixel tương ứng trong 'hình ảnh MAP'.DisplacementMapFilter hoạt động như thế nào?

Vấn đề là hình ảnh đích của tôi chứa pixel không có trong hình ảnh nguồn!

Ví dụ, tôi có một Unicolor 10 * 10 pixel 'hình ảnh nguồn' với BitmapData này:

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 

Bây giờ, tôi đi chuyển MAP BLACK này và tôi thêm một chút vuông BLUE:

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 

kết quả:

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 

Vì vậy, tôi không hiểu tại sao tôi có '001' pixel mà không tồn tại trong hình ảnh nguồn.

Cảm ơn bạn rất nhiều.

+0

Và bây giờ, thời gian cho một plug không biết xấu hổ cho [câu hỏi] của tôi (http://stackoverflow.com/questions/9260717/displacement-map-filter-in-opencv). – karlphillip

Trả lời

3

Bộ lọc bản đồ dịch chuyển quyết định những pixel để lấy từ bitmap nguồn sử dụng this formula:

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

dstPixel là bitmap đích, srcPixel là nguồn bitmap, và componentX/Y là từ bitmap dịch chuyển. Ánh xạ được xác định bởi độ dài của kênh thành phần là 128. Lưu ý rằng 128 là giá trị trung lập không có phép biến đổi và cùng một pixel nguồn được sử dụng.

Ví dụ: hãy xem xét pixel tại (1, 1) trong trường hợp của bạn. Kênh thành phần của bạn có màu xanh lam và kênh màu xanh lam tại (1, 1) trong bản đồ chuyển vị trí có giá trị bằng 0. Vì vậy, chúng tôi thay thế bằng (0 - 128)/256 hoặc -0,5. Vì vậy, điểm ảnh cuối cùng mà chúng tôi lấy từ bitmap nguồn là (0,5, 0,5).

Nhưng sử dụng nửa pixel là gì? Hóa ra Flash sử dụng bilinear filtering để làm mịn kết quả. Bạn kết thúc với một sự pha trộn của các màu sắc trong bốn điểm ảnh giữa (0,0) và (1,1).

Đây là lý do bạn thấy các pixel lẻ không có trong hình nguồn. Mặc dù tất cả các pixel trong ảnh nguồn của bạn có cùng màu, nhưng dường như có một số điểm không chính xác khi Flash nội suy giữa các màu, vì vậy đôi khi bạn nhận được giá trị chỉ là hơi tắt. Lưu ý rằng nếu bạn sử dụng một giá trị trong bitmap dịch chuyển của bạn chia "sạch" cho 128, chẳng hạn như 0 hoặc 64, thì bạn sẽ nhận được kết quả chính xác. Nhưng nếu bạn sử dụng một giá trị như 255 hoặc 19, bạn sẽ gặp phải một số lỗi.

Thật không may, dường như không có cách nào để tắt tính năng lọc và sử dụng lấy mẫu lân cận gần nhất đơn giản. Vì vậy, nếu bạn cần đảm bảo rằng không có màu sắc mới được giới thiệu, thì bạn phải cẩn thận chọn các giá trị trong bản đồ dịch chuyển của bạn. Bạn có thể sử dụng Pixel Bender để tạo hạt nhân thực hiện những gì bạn cần. Pixel Bender cho phép bạn thực hiện lấy mẫu lân cận gần nhất từ ​​bitmap nguồn.

+0

Hoàn hảo. Cảm ơn nhiều. –

Các vấn đề liên quan