Blockproc
è una funzione davvero utile per "grigliare" un'immagine in MATLAB. È abbastanza ben documentato e arriva persino con lo tutorial page. Tuttavia, quando vuoi una sorta di sovrapposizione tra blocchi, le cose diventano più complicate. I forum di Mathworks hanno alcune spiegazioni, tra cui this one e this one, e c'è un tentativo di una spiegazione here (domanda n. 1), ma nessuno spiega davvero da nessuna parte perché alcune bandiere debbano essere impostate con altre. Qualcuno può spiegare quale è lo scopo del parametro 'BorderSize'
? Sembra che quando 'Trim Borders'
è impostato su false
, il parametro 'BorderSize'
fa esattamente quello che dice la documentazione (e ciò che vi aspettereste):'BorderSize' e 'TrimBorder' nella funzione blockLoc MATLAB
'BorderSize': A due elementi vettore, [VH], specificando il quantità di pixel del bordo da aggiungere a ciascun blocco. La funzione aggiunge le righe V sopra e sotto ciascun blocco e le colonne H a sinistra ea destra di ciascun blocco. La dimensione di ogni blocco risultante sarà: [M + 2 * V, N + 2 * H]
Per impostazione predefinita, la funzione rimuove automaticamente il bordo dal risultato del divertimento. Vedi il parametro 'TrimBorder' per maggiori informazioni. I blocchi funzione si bloccano con i bordi che si estendono oltre i bordi dell'immagine con zeri.
Ma quando si leggono i 'TrimBorder'
dettagli, non chiarire molto:
'TrimBorder': Uno scalare logica. Se impostato su true, la funzione blockproc elimina i pixel di confine dall'output della funzione utente, divertente. La funzione rimuove le righe V dalla parte superiore e inferiore dell'output di divertimento e le colonne H dai bordi sinistro e destro. Il parametro 'BorderSize' definisce V e H. L'impostazione predefinita è true, ovvero la funzione blockproc rimuove automaticamente i bordi dall'output divertente.
Perché dovrei includere un 'BorderSize'
(vale a dire i riquadri di sovrapposizione) ma non applicarlo all'output? Si tratta di una bandiera poco spiegata: 'TrimBorder'
deve essere disattivato per utilizzare 'BorderSize'
o c'è qualcosa di più grande che mi manca? Immagino che l'essenza della mia confusione sia: quando vorrei 'TrimBorder'
impostato su false
?
Esempi:
% 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 = []
Questa è una grande risposta. In generale, se il blocco di output dalla funzione di blocco dovrebbe avere la stessa dimensione del blocco di input, probabilmente si vorrà ritagliare i bordi. Se la funzione di blocco modifica fondamentalmente i dati in uscita (come nel tuo caso, dove stai prendendo in un blocco intero e restituendo un valore scalare) probabilmente NON vuoi tagliare i bordi. Non c'è vera magia che accada. Se TrimBorder è impostato su true, dopo che la funzione di blocco restituisce l'output verrà "ritagliato" dalla dimensione del bordo. Nel tuo caso l'intera produzione è stata "ritagliata". – brendan
Questa è una risposta molto dettagliata, grazie! Puoi spiegare il comportamento nel mio esempio "cattivo"? Perché lasciare "TrimBorder" sul risultato in un'uscita di matrice vuota? – marcman
Mi dispiace, ho perso l'indirizzo. È essenzialmente ciò che @brendan ha detto sopra: TrimBorder = true tenterà di "rimuovere" il Bordersize ([1 1]) dall'output della funzione, che è già uno scalare, quindi l'output effettivo è []! –