Genere la matriz de convolución del kernel 2D para la forma de convolución de `same`


10

Quiero encontrar una matriz de convolución 2D para un determinado núcleo . Por ejemplo, para una imagen de tamaño , quiero (en MATALB):H
Imgm×n

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

Donde Testá la matriz de convolución y samesignifica que la forma de convolución (tamaño de salida) coincide con el tamaño de entrada.

Teóricamente, H debería convertirse en una matriz de toeplitz, estoy usando la función MATLAB convmtx2():

T = convmtx2(H, m, n);

Sin embargo, Tes de tamaño ya que MATLAB genera una matriz de convolución que coincide con la forma de convolución de .(m+2)(n+2)×(mn)convmtx2full

¿Hay alguna manera de generar la matriz de convolución que coincida conv2()con el sameparámetro de forma de convolución?


¿Está buscando simplemente obtener el mismo T * Img resultante o le gustaría usar T para un propósito diferente?
Charna

Edité su código y matemáticas para que parezca más atractivo. Puede hacerlo usted mismo en futuras preguntas. Para la edición de Latex use $$.
Jav_Rock

Pregunta relacionada: dsp.stackexchange.com/questions/17418 .
Royi

Respuestas:


5

No puedo probar esto en mi computadora porque no tengo la función convtmx2, esto es lo que dice la ayuda de MATLAB:

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

T = convmtx2(H,m,n)devuelve la matriz de convolución Tpara la matriz H. Si Xes una matriz m-por-n, entonces reshape(T*X(:),size(H)+[m n]-1)es lo mismo que conv2(X,H).

Esto obtendría la misma convolución resultante, conv2(X,H)pero aún así tendría que extraer la pieza correcta de la convolución.


¡Bienvenido a DSP.SE, y esta es una gran respuesta!
Phonon

Creo que a veces uno necesita la matriz real para analizarlo (El operador adjunto, el inverso, etc.). Por lo tanto, este método no funcionará (a menos que comience a eliminar filas de la matriz, que será lenta ya que es dispersa).
Royi

1

Escribí una función que resuelve esto en mi StackOverflow Q2080835 GitHub Repository (Eche un vistazo CreateImageConvMtx()).
En realidad, la función puede admitir cualquier forma de convolución que desee full, samey valid.

El código es el siguiente:

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

Disfrutar...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.