2009-03-25 27 views
8

Tôi đang thực hiện trích xuất đối tượng địa lý từ một hình ảnh trong Matlab. Tôi phải áp dụng nhiều chức năng trên các cửa sổ nXn cho mục đích này (chẳng hạn như để tìm phương sai trên mỗi cửa sổ 3X3, v.v.
Có cách nào dễ dàng và hiệu quả để thực hiện điều này trong Matlab ngoài việc lặp lại ma trận và Đối với một số chức năng, tôi đã có thể tìm thấy một mặt nạ tương đương và áp dụng chúng bằng cách sử dụng filter2, nhưng đối với nhiều người khác tôi dường như không có một sự xa xỉ như vậy (một ví dụ tốt: trung bình của một cửa sổ 3x3).
Những gì tôi muốn một cái gì đó giống như arrayfun, nhưng một cái gì đó mà áp dụng cho các cửa sổ nxn, không yếu tố cá nhân là.
Cảm ơn,
SundarLàm cách nào để áp dụng các cửa sổ di chuyển cho ma trận 2D trong MATLAB?

+0

Có thể giúp bạn cập nhật câu hỏi và liệt kê các hoạt động cụ thể bạn muốn áp dụng cho các phần tử cửa sổ. Có thể có nhiều cách để biến chúng thành các phần tử mặt nạ/bộ lọc để sử dụng với FILTER2 (hoặc có thể là CONV2). – gnovice

+0

bạn có hộp công cụ xử lý hình ảnh không? – Azim

Trả lời

4

Nếu bạn có hộp công cụ xử lý hình ảnh thì bạn có thể sử dụng blkproc để xử lý nxm khối hình ảnh của mình bằng các hàm được xác định tùy chỉnh. Dưới đây là một ví dụ

function Ip = imageProcessed(II,blockSize) 
    % FUNCTION imageProcessed calculates average value of blocks of size nxm 
    % blocks 
     if nargin<2, 
     % default/example value for block size 
     blockSize = [3 4]; 
     end 

     if size(II,3)>1, 
      % blkproc requires a grayscale image 
      % convert II to gray scale if it is RGB. 
      II=rgb2gray(II) 
     end 


     % Custom average function. 
     myAveFun = @(x) ones(size(x))*sum(x(:))/length(x(:)); 

     % use blkproc to process image 
     Ip = blkproc(II,[blockSize(1), blockSize(2)],myAveFun); 
end 

Lưu ý:

Tính đến hình ảnh MATLAB 2009b của Processing Toolbox, blkproc được depcrecated và thay thế bằng blockproc (xem R2099b phần here). Vì vậy, hai dòng cuối cùng có thể được thay đổi thành:

myAveFun = @(blkstrct) ones(size(blkstrct.data))*mean(blkstrct.data(:)) 
Ip = blockproc(II,blockSize,myAveFun); 
+0

Cảm ơn bạn, tôi có hộp công cụ xử lý hình ảnh và đó chính xác là những gì tôi cần. – sundar

+0

chào mừng bạn. vui vì nó đã giúp. – Azim

+0

Sự trợ giúp cho chức năng này đã chỉ cho tôi 'colfilt'. Hóa ra colfilt với một cửa sổ 'trượt' làm cho công việc của tôi dễ dàng hơn. Cảm ơn bạn đã mở mảng chức năng mới này cho tôi. – sundar

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