Quiero encontrar una matriz de convolución 2D para un determinado núcleo .
Por ejemplo, para una imagen de tamaño , quiero (en MATALB):Img
T * Img = reshape(conv2(Img, H, 'same'), [], 1);
Donde T
está la matriz de convolución y same
significa 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, T
es de tamaño ya que MATLAB genera una matriz de convolución que coincide con la forma de convolución de .convmtx2
full
¿Hay alguna manera de generar la matriz de convolución que coincida conv2()
con el same
parámetro de forma de convolución?
Respuestas:
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ónT
para la matrizH
. SiX
es una matriz m-por-n, entoncesreshape(T*X(:),size(H)+[m n]-1)
es lo mismo queconv2(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.fuente
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
,same
yvalid
.El código es el siguiente:
Disfrutar...
fuente