2016-01-12 16 views
5

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 = [] 

risposta

5

Perché dovrei voler includere un (cioè tessere di sovrapposizione) '' BorderSize ma non applicarlo al uscita?

prendere in considerazione tutti i flussi di lavoro in cui si desidera applicare una funzione fun su ciascun blocco di dimensione MxN in un'immagine, ma per il risultato sia valido è effettivamente necessario i pixel di confine di tutto il blocco MxN. (filtraggio, morfologia, qualsiasi funzione in cui un singolo valore del pixel di uscita dipende da un intorno circostante mxn). ti serve il blocco di input (M + m, N + n) per calcolare un blocco di uscita MxN.

semplice (aka madeup) Esempio:

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

Avviso le linee della griglia? In questo caso particolare, chiameresti imfilter sull'immagine completa.Ma blockproc ti consente di lavorare con immagini più grandi della tua memoria fisica. Quindi per questa discussione, immagini im è un enorme file tiff.

Per questo flusso di lavoro - se hai appena usato BorderSize per includere il bordo 3 pixel attorno a ciascuna 20x20 bloccare e fatto non tagliare il confine uscita:

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

Così - si davvero bisogno di tagliare il bordo (predefinito)

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

Nota - Ho utilizzato IMFILTER come esempio. Per le immagini di piccole dimensioni, si usa direttamente IMFITLER. Solo per le immagini di grandi dimensioni si potrebbe prendere in considerazione l'utilizzo di IMFITLER in BLOCPROC.

+0

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

+0

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

+0

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 è []! –

0

Solo nel caso in cui si stanno cercando per ottenere un blocco di sovrapposizione e il salvataggio it-

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

ii = [1-qualunque sia u vuole il nome del file]% [01:20] se l'immagine ha 20 blocchi risultanti

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

% Qui, il bordersize è x, y 10, 10-dell'intera immagine a- non di blocchi

Problemi correlati