2011-09-02 23 views
5

Tôi thích blockproc, nó làm việc với hình ảnh lớn (rất lớn) dễ dàng. Tuy nhiên, theo như tôi hiểu, nó được giới hạn để làm việc với các chức năng mà xuất một ma trận có cùng kích thước với đầu vào mà chúng mất. Vì vậy, tôi đã tự hỏi nếu có một cách để nhân rộng/mô phỏng những gì blockproc hiện nhưng đối với các chức năng mà đầu ra một mảng ô. Chúng ta có thể giả định rằng mảng đầu ra từ hàm xử lý có cùng kích thước của ma trận đầu vào, hoặc nó chỉ xuất ra một phần tử ô, trong trường hợp đó đầu ra cuối cùng từ tổng xử lý sẽ là mảng ô có các phần tử M x N, với MN chỉ định ốp lát cho quá trình xử lý.Chức năng giống như Blockproc cho đầu ra mảng di động

Tôi tin rằng mình có thể tự mình xây dựng bằng cách sử dụng cellfun, nhưng tôi tự hỏi liệu có bất kỳ nội trang hoặc thư viện nào khác (có thể là bên thứ ba?) Mà tôi có thể sử dụng cho điều này hay không.

Cụ thể hơn, tôi đang tìm kiếm cái gì đó có sức mạnh giống như blockproc:

  • thể tải một hình ảnh lớn từ đĩa dần gạch-by-ngói để giảm thiểu bộ nhớ của quá trình xử lý
  • chăm sóc của nối cuối cùng của kết quả để xây dựng các mảng tế bào thức
  • có một giao diện tương tự như blockproc (ví dụ # của gạch, vv)
+0

Tôi lấy mảng ô của bạn chứa dữ liệu "phức tạp" để bạn không thể chỉ quấn chức năng của mình vào ['cell2mat'] (http://www.mathworks.de/help/techdoc/ref/cell2mat.html) và sử dụng 'blockproc'? –

+0

Đúng vậy @Jonas.Tôi đang tìm một giải pháp không đưa ra bất kỳ giả định nào về ô đầu ra từ hàm thực hiện quá trình xử lý (ví dụ: loại, nội dung của nó, v.v.) –

Trả lời

2

Dưới đây là giải pháp đáp ứng các tiêu chí của bạn ngoại trừ điểm đầu tiên

Sử dụng chức năng IM2COL để sắp xếp các khối hình ảnh riêng biệt từ hình ảnh thành cột, sau đó áp dụng chức năng của bạn cho mỗi cột lưu kết quả vào một ô.

Tất nhiên điều này chỉ hoạt động nếu phù hợp với tất cả các khối vào bộ nhớ, nếu không bạn sẽ phải tự viết code mà chiết xuất một khối tại một thời điểm và xử lý nó theo cách đó ...

%# read image 
img = im2double(imread('tire.tif')); 

%# blocks params 
sizBlk = [8 8]; 
numBlk = ceil(size(img) ./ sizBlk); 

%# extract blocks 
B = im2col(img, sizBlk, 'distinct'); 
B = reshape(B, [sizBlk size(B,2)]); %# put blocks on the 3rd dimension 
B = squeeze(num2cell(B,[1 2]));  %# convert to cell array 
B = reshape(B, numBlk);    %# reshape as blocks overlayed on image 

%# process blocks 
myFcn = @(blk) [mean2(blk) std2(blk)]; %# or any other processing function 
I = cellfun(myFcn, B, 'UniformOutput',false); 

%# in this example, we can show each component separately 
subplot(121), imshow(cellfun(@(c)c(1),I)), title('mean') 
subplot(122), imshow(cellfun(@(c)c(2),I)), title('std') 

Ngoài ra, bạn vẫn có thể sử dụng chức năng BLOCKPROC, nhưng bạn phải gọi hàm đó nhiều lần, mỗi lần tính toán một tính năng duy nhất:

%# compute one feature at a time 
b1 = blockproc(img, sizBlk, @(b)mean2(b.data), 'PadPartialBlocks',true); 
b2 = blockproc(img, sizBlk, @(b)std2(b.data), 'PadPartialBlocks',true); 

%# combine into cellarray of features 
II = arrayfun(@(varargin)[varargin{:}], b1, b2, 'UniformOutput',false); 

%# compare to previous results 
isequal(I,II) 
+0

Cảm ơn! Điều này rất hữu ích. –

0

Tôi đã làm điều gì đó tương tự, mặc dù với nume giá trị ric thay vì ô.

Something như thế này nên làm việc:

I = imread('pout.tif'); 

G = blockproc(I, [8 8], @(b) shiftdim(imhist(b.data)', -1), 'PadPartialBlocks', true); 

G = reshape(G, size(G, 1) * size(G, 2), size(G, 3)); 

pout.tif là một hình ảnh thang độ xám nhưng tôi chắc chắn điều này có thể được thay đổi cho RGB.

Cũng cẩn thận khi sử dụng shiftdim, imhist trả về một vectơ hàng để tôi chuyển nó sang cột.

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