Genera la matrice di convoluzione del kernel 2D per la forma di convoluzione di "same"


10

Voglio trovare una matrice di convoluzione per un certo 2D kernel . Ad esempio, per l'immagine di dimensioni , voglio (in MATALB):H
Imgm×n

T * Img = reshape(conv2(Img, H, 'same'), [], 1);

Dove si Ttrova la matrice di convoluzione e sameindica che la forma di convoluzione (dimensione di output) corrisponde alla dimensione di input.

Teoricamente, H dovrebbe essere convertito in una matrice di toeplitz, sto usando la funzione MATLAB convmtx2():

T = convmtx2(H, m, n);

Tuttavia Tè di dimensioni poiché MATLAB genera una matrice di convoluzione che corrisponde alla forma di convoluzione di .(m+2)(n+2)×(mn)convmtx2full

Esiste un modo per generare la matrice di convoluzione che corrisponde all'uso conv2()con il sameparametro della forma di convoluzione?


Stai semplicemente cercando di ottenere lo stesso T * Img risultante o desideri utilizzare T per uno scopo diverso?
Charna,

Ho modificato il codice e la matematica in modo che appaia più attraente. Puoi farlo tu stesso per domande future. Per la modifica di Latex usa $$.
Jav_Rock,

Risposte:


5

Non riesco a provarlo sul mio computer perché non ho la funzione convtmx2, ecco cosa dice l'aiuto MATLAB:

http://www.mathworks.com/help/toolbox/images/ref/convmtx2.html

T = convmtx2(H,m,n)restituisce la matrice di convoluzione Tper la matrice H. Se Xè una matrice m-by-n, allora reshape(T*X(:),size(H)+[m n]-1)è la stessa di conv2(X,H).

Ciò otterrebbe la stessa convoluzione risultante di conv2(X,H)ma poi dovresti ancora estrarre il pezzo corretto della convoluzione.


Benvenuto in DSP.SE, e questa è un'ottima risposta!
Phonon,

Penso che a volte sia necessaria la matrice effettiva per analizzarla (l'operatore aggiunto, l'inverso, ecc ...). Quindi questo metodo non funzionerà (a meno che non inizi a rimuovere le righe dalla matrice che sarà lenta in quanto sparsa).
Royi,

1

Ho scritto una funzione che risolve questo problema nel mio repository GitHub StackOverflow Q2080835 (dai un'occhiata CreateImageConvMtx()).
In realtà la funzione in grado di supportare qualsiasi forma circonvoluzione vuoi - full, samee valid.

Il codice è il seguente:

function [ mK ] = CreateImageConvMtx( mH, numRows, numCols, convShape )

CONVOLUTION_SHAPE_FULL  = 1;
CONVOLUTION_SHAPE_SAME  = 2;
CONVOLUTION_SHAPE_VALID = 3;

switch(convShape)
    case(CONVOLUTION_SHAPE_FULL)
        % Code for the 'full' case
        convShapeString = 'full';
    case(CONVOLUTION_SHAPE_SAME)
        % Code for the 'same' case
        convShapeString = 'same';
    case(CONVOLUTION_SHAPE_VALID)
        % Code for the 'valid' case
        convShapeString = 'valid';
end

mImpulse = zeros(numRows, numCols);

for ii = numel(mImpulse):-1:1
    mImpulse(ii)    = 1; %<! Create impulse image corresponding to i-th output matrix column
    mTmp            = sparse(conv2(mImpulse, mH, convShapeString)); %<! The impulse response
    cColumn{ii}     = mTmp(:);
    mImpulse(ii)    = 0;
end

mK = cell2mat(cColumn);


end

Godere...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.