2016-01-12 16 views
5

Blockproc là một chức năng thực sự hữu ích cho "gridding" một hình ảnh trong MATLAB. Nó được viết khá tốt và thậm chí nó được hoàn chỉnh với tutorial page. Tuy nhiên, khi bạn muốn một số loại chồng chéo giữa các khối, mọi thứ trở nên phức tạp hơn. Các diễn đàn Mathworks có một số giải thích, bao gồm this onethis one, và có một nỗ lực tại một lời giải thích here (Câu hỏi số 1), nhưng không ai thực sự giải thích bất cứ nơi nào tại sao cờ nhất định cần phải được thiết lập với những người khác. Ai đó có thể giải thích mục đích của thông số 'BorderSize' là gì? Dường như khi 'Trim Borders' được thiết lập để false, tham số 'BorderSize' thực hiện chính xác những gì các tài liệu nói (và những gì bạn mong muốn):'BorderSize' và 'TrimBorder' trong hàm MATLAB blockproc

'BorderSize': Một vector hai yếu tố, [VH], xác định số lượng pixel đường viền để thêm vào từng khối. Hàm này thêm các hàng V ở trên và bên dưới mỗi khối và H cột bên trái và bên phải của mỗi khối. Kích thước của mỗi khối kết quả sẽ là: [M + 2 * V, N + 2 * H]

Theo mặc định, chức năng này sẽ tự động xóa đường biên khỏi kết quả vui. Xem thông số 'TrimBorder' để biết thêm thông tin. Các miếng đệm chức năng chặn với các đường viền mở rộng ra ngoài các cạnh hình ảnh với các số không.

Nhưng khi bạn đọc 'TrimBorder' chi tiết, nó không làm sáng tỏ nhiều:

'TrimBorder': Một đại lượng vô hướng logic. Khi được đặt thành true, chức năng blockproc sẽ cắt các pixel biên giới khỏi đầu ra của chức năng người dùng, vui vẻ. Hàm này loại bỏ các hàng V từ trên cùng và dưới cùng của đầu ra của các cột vui nhộn và H từ các cạnh trái và phải. Tham số 'BorderSize' định nghĩa V và H. Mặc định là true, nghĩa là hàm blockproc tự động loại bỏ các đường biên từ đầu ra vui nhộn.

Tại sao tôi muốn bao gồm 'BorderSize' (ví dụ: gạch xếp chồng lên nhau) nhưng không áp dụng cho đầu ra? Đây có phải chỉ là cờ được giải thích kém: 'TrimBorder' phải được tắt để sử dụng 'BorderSize' hoặc có thứ gì đó lớn hơn tôi bị thiếu không? Tôi đoán ý chính của sự nhầm lẫn của tôi là: khi nào tôi muốn 'TrimBorder' đặt thành false?

Ví dụ:

% Non-overlapping 
A = ones(10); 
B = blockproc(A, [2,2], @(x)sum(sum(x.data))); 
% B = 
% [ 4 4 4 4 4 ] 
% [ 4 4 4 4 4 ] 
% [ 4 4 4 4 4 ] 
% [ 4 4 4 4 4 ] 
% [ 4 4 4 4 4 ] 

% GOOD Overlapping--one-pixel border 
B = blockproc(A, [2,2], @(x)sum(sum(x.data)), 'BorderSize', [1,1], 'TrimBorder', false); 
% B = 
% [ 9 12 12 12 9 ] 
% [ 12 16 16 16 12 ] 
% [ 12 16 16 16 12 ] 
% [ 12 16 16 16 12 ] 
% [ 9 12 12 12 9 ] 

% BAD Overlapping--one-pixel border 
B = blockproc(A, [2,2], @(x)sum(sum(x.data)), 'BorderSize', [1,1]); 
% B = [] 

Trả lời

5

Tại sao tôi muốn để bao gồm một 'BorderSize' (ví dụ: gạch chồng lên nhau) nhưng không áp dụng nó vào đầu ra?

xem xét tất cả các quy trình công việc mà bạn muốn áp dụng một hàm fun trên mỗi khối kích thước MxN trong một hình ảnh, nhưng đối với kết quả có giá trị bạn thực sự cần các pixel đường viền xung quanh khối MxN. (lọc, hình thái học, bất kỳ chức năng nào mà một giá trị pixel đầu ra phụ thuộc vào một vùng lân cận mxn). tức là bạn cần khối đầu vào (M + m, N + n) để tính một khối đầu ra MxN.

đơn giản (aka madeup) ví dụ:

h = fspecial('gaussian', 3); 
im = imread('peppers.png'); 
B1 = blockproc(im, [20 20], @(bs)imfilter(bs.data,h)); 
imshowpair(im, B1,'montage'); 

enter image description here

Chú ý các đường lưới? Trong trường hợp cụ thể này, bạn sẽ chỉ gọi imfilter trên hình ảnh đầy đủ.Nhưng blockproc cho phép bạn làm việc với hình ảnh lớn hơn bộ nhớ vật lý của bạn. Vì vậy, cho cuộc thảo luận này, hãy tưởng tượng im là một tệp tiff khổng lồ.

Đối với công việc này - nếu bạn chỉ sử dụng BorderSize để bao gồm các biên giới 3 pixel xung quanh mỗi 20x20 chặn đã không cắt biên giới đầu ra:

h = fspecial('gaussian'); 
im = imread('peppers.png'); 
B1 = blockproc(im, [20 20], @(bs)imfilter(bs.data,h), 'BorderSize', [3 3], 'TrimBorder', false); 
imshowpair(im, B1,'montage'); 

enter image description here

Vì vậy - bạn thực sự cần phải cắt đường viền (mặc định)

h = fspecial('gaussian'); 
im = imread('peppers.png'); 
B1 = blockproc(im, [20 20], @(bs)imfilter(bs.data,h), 'BorderSize', [3 3], 'TrimBorder', true); 
imshowpair(im, B1,'montage'); 

enter image description here

Lưu ý - Tôi đã sử dụng IMFILTER làm ví dụ. Đối với hình ảnh nhỏ, người ta sẽ sử dụng trực tiếp IMFITLER. Chỉ cho những hình ảnh lớn sẽ xem xét sử dụng IMFITLER trong BLOCPROC.

+0

Đây là một câu trả lời tuyệt vời. Nói chung nếu khối đầu ra của bạn từ chức năng khối của bạn được cho là có cùng kích thước tại khối đầu vào, bạn sẽ có thể muốn cắt đường viền của mình. Nếu chức năng khối của bạn về cơ bản là thay đổi dữ liệu sắp ra (như trong trường hợp của bạn, nơi bạn đang dùng trong một khối và trả về một giá trị vô hướng), bạn có thể sẽ KHÔNG muốn cắt các đường viền. Không có ma thuật thực sự xảy ra. Nếu TrimBorder được đặt thành true thì sau khi hàm khối của bạn trả về kết quả, nó sẽ được "cắt" bởi kích thước đường viền. Trong trường hợp của bạn toàn bộ đầu ra của bạn đã được "tỉa" đi. – brendan

+0

Đây là câu trả lời rất chi tiết, cảm ơn bạn! Bạn có thể giải thích hành vi trong ví dụ "xấu" của tôi không? Tại sao lại để lại 'TrimBorder' trên kết quả trong một đầu ra ma trận rỗng? – marcman

+0

Xin lỗi, tôi đã bỏ lỡ địa chỉ đó. Về cơ bản những gì @brendan đã nói ở trên - TrimBorder = true sẽ cố gắng 'loại bỏ' Bordersize ([1 1]) khỏi đầu ra của hàm của bạn, mà đã là một vô hướng, do đó đầu ra thực tế là []! –

0

Chỉ trong trường hợp bạn đang tìm kiếm để có được một khối chồng lên nhau và tiết kiệm nó-

function cropSaveBlock(bs,ii) 
    subBlockRegion =(bs.data(:,:)); 
    fileName = [strrep(num2str(bs.location,ii),' ','_') '.jpg']; 
    imwrite(subBlockRegion, fileName); 
    end 
    a = imread('cameraman.tif'); 

ii = [1-bất cứ điều gì u muốn nộp name]% [01:20] nếu hình ảnh của bạn có 20 khối kết quả

aa=blockproc(a, [257 257], @(bs)cropSaveBlock(bs,ii),'BorderSize', [10 10 ]) 

% Ở đây, bordersize là x, y 10, 10 của toàn bộ hình ảnh a- không của các khối

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