Generieren Sie die Faltungsmatrix des 2D-Kernels für die Faltungsform von "same"

10

Ich möchte eine Faltungsmatrix für einen bestimmten 2D-Kernel H .
Zum Beispiel möchte ich für ein Bild Imgder Größe m×n (in MATALB):

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

Wo Tist die Faltungsmatrix und samebedeutet, dass die Faltungsform (Ausgabegröße) mit der Eingabegröße übereinstimmt.

Theoretisch sollte H in eine Toeplitz-Matrix konvertiert werden. Ich verwende die MATLAB-Funktion convmtx2():

T = convmtx2(H, m, n);

Ist Tjedoch von der Größe (m+2)(n+2)×(mn) da MATLABs convmtx2eine Faltungsmatrix erzeugt, die der Faltungsform von entspricht full.

Gibt es eine Möglichkeit, die Faltungsmatrix zu generieren, die conv2()mit dem sameFaltungsformparameter übereinstimmt ?

Matlabit
quelle
Möchten Sie einfach das gleiche resultierende T * Img erhalten oder möchten Sie T für einen anderen Zweck verwenden?
Charna
Ich habe Ihren Code und Ihre Mathematik so bearbeitet, dass sie attraktiver aussieht. Sie können dies bei zukünftigen Fragen selbst tun. Verwenden Sie für die Latexbearbeitung $$.
Jav_Rock
Verwandte Frage - dsp.stackexchange.com/questions/17418 .
Royi

Antworten:

5

Ich kann dies auf meinem Computer nicht testen, da ich nicht über die Funktion convtmx2 verfüge. In der MATLAB-Hilfe heißt es Folgendes:

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

T = convmtx2(H,m,n)Gibt die Faltungsmatrix Tfür die Matrix zurück H. Wenn Xes sich um eine m-mal-n-Matrix handelt, reshape(T*X(:),size(H)+[m n]-1)ist dies dasselbe wie conv2(X,H).

Dies würde die gleiche resultierende Faltung von erhalten, conv2(X,H)aber dann müssten Sie immer noch das richtige Stück der Faltung herausziehen.

Charna
quelle
Willkommen bei DSP.SE, und das ist eine großartige Antwort!
Phonon
Ich denke, dass man manchmal die eigentliche Matrix benötigt, um sie zu analysieren (der adjungierte Operator, der Inverse usw.). Daher funktioniert diese Methode nicht (es sei denn, Sie entfernen Zeilen aus der Matrix, die langsam ist, da sie sparsam ist).
Royi
1

Ich habe eine Funktion geschrieben, die dies in meinem StackOverflow Q2080835 GitHub Repository löst (siehe CreateImageConvMtx()).
Eigentlich kann die Funktion jeder Faltung Form unterstützen Sie möchten - full, sameund valid.

Der Code lautet wie folgt:

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

Genießen...

Royi
quelle