Hasilkan Matriks Konvolusi dari Kernel 2D untuk Bentuk Konvolusi dari `sama`

10

Saya ingin mencari matriks konvolusi untuk kernel 2D tertentu . Misalnya, untuk gambar ukuran , saya ingin (dalam MATALB):H
Imgm×n

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

Di mana Tmatriks konvolusi dan sameberarti Bentuk Konvolusi (Ukuran Output) cocok dengan ukuran input.

Secara teoritis, H harus dikonversi ke matriks toeplitz, saya menggunakan fungsi MATLAB convmtx2():

T = convmtx2(H, m, n);

Namun Tadalah ukuran sebagai MATLAB's menghasilkan matriks konvolusi yang cocok dengan Bentuk Konvolusi .(m+2)(n+2)×(mn)convmtx2full

Apakah ada cara untuk menghasilkan Matriks Konvolusi yang cocok conv2()dengan menggunakan sameparameter bentuk konvolusi?

matlabit
sumber
Apakah Anda mencari hanya untuk mendapatkan T * Img yang sama atau Anda ingin menggunakan T untuk tujuan yang berbeda?
Charna
Saya mengedit kode dan matematika Anda sehingga terlihat lebih menarik. Anda dapat melakukannya sendiri pada pertanyaan mendatang. Untuk pengeditan Lateks, gunakan $$.
Jav_Rock
Pertanyaan terkait - dsp.stackexchange.com/questions/17418 .
Royi

Jawaban:

5

Saya tidak dapat menguji ini di komputer saya karena saya tidak memiliki fungsi convtmx2, inilah yang dikatakan bantuan MATLAB:

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

T = convmtx2(H,m,n)mengembalikan matriks konvolusi Tuntuk matriks H. Jika Xadalah matriks m-by-n, maka reshape(T*X(:),size(H)+[m n]-1)sama dengan conv2(X,H).

Ini akan menghasilkan lilitan yang sama conv2(X,H)tetapi kemudian Anda masih harus menarik lilitan yang benar.

Charna
sumber
Selamat datang di DSP.SE, dan ini adalah jawaban yang bagus!
Telepon
Saya pikir kadang-kadang kita perlu matriks aktual untuk menganalisanya (Operator adjoint, invers, dll ...). Karenanya metode ini tidak akan berfungsi (Kecuali jika Anda mulai menghapus baris dari matriks yang akan lambat karena jarang).
Royi
1

Saya menulis sebuah fungsi yang memecahkan ini dalam StackOverflow Q2080835 GitHub Repository saya (Lihat CreateImageConvMtx()).
Sebenarnya fungsi tersebut dapat mendukung bentuk konvolusi yang Anda inginkan - full, samedan valid.

Kode tersebut adalah sebagai berikut:

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

Nikmati...

Royi
sumber