Je veux trouver une matrice de convolution pour un certain noyau 2D .
Par exemple, pour une image de taille , je veux (en MATALB):Img
T * Img = reshape(conv2(Img, H, 'same'), [], 1);
Où T
est la matrice de convolution et same
signifie que la forme de convolution (taille de sortie) correspond à la taille d'entrée.
Théoriquement, H devrait être converti en matrice toeplitz, j'utilise la fonction MATLAB convmtx2()
:
T = convmtx2(H, m, n);
Pourtant, il T
est de taille car MATLAB génère une matrice de convolution qui correspond à la forme de convolution de .convmtx2
full
Existe-t-il un moyen de générer la matrice de convolution qui correspond à l'utilisation conv2()
avec le same
paramètre de forme de convolution?
Réponses:
Je ne peux pas tester cela sur mon ordinateur car je n'ai pas la fonction convtmx2, voici ce que dit l'aide MATLAB:
http://www.mathworks.com/help/toolbox/images/ref/convmtx2.html
T = convmtx2(H,m,n)
renvoie la matrice de convolutionT
pour la matriceH
. SiX
est une matrice m par n, alorsreshape(T*X(:),size(H)+[m n]-1)
c'est la même chose queconv2(X,H)
.Cela obtiendrait la même convolution résultante de
conv2(X,H)
mais il vous faudrait alors retirer la bonne pièce de la convolution.la source
J'ai écrit une fonction qui résout ce problème dans mon référentiel GitHub StackOverflow Q2080835 (jetez un œil à
CreateImageConvMtx()
).En fait, la fonction peut prendre en charge n'importe quelle forme de convolution que vous souhaitez -
full
,same
etvalid
.Le code est le suivant:
Prendre plaisir...
la source