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 one và this 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 = []
Đâ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
Đâ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
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à []! –