Eu quero encontrar uma matriz de convolução para um determinado 2D do kernel .
Por exemplo, para imagem Img
de tamanho , desejo (em MATALB):
T * Img = reshape(conv2(Img, H, 'same'), [], 1);
Onde T
está a matriz de convolução e same
significa que a Forma da convolução (tamanho da saída) corresponde ao tamanho da entrada.
Teoricamente, H deve ser convertido em uma matriz toeplitz, estou usando a função MATLAB convmtx2()
:
T = convmtx2(H, m, n);
No entanto, T
é de tamanho pois o MATLAB convmtx2
gera uma matriz de convolução que corresponde à Forma de Convolução de full
.
Existe uma maneira de gerar a matriz de convolução que corresponda ao uso conv2()
com o same
parâmetro de forma de convolução?
Respostas:
Não posso testar isso no meu computador porque não tenho a função convtmx2. Aqui está o que a ajuda do MATLAB diz:
http://www.mathworks.com/help/toolbox/images/ref/convmtx2.html
T = convmtx2(H,m,n)
retorna a matriz de convoluçãoT
para a matrizH
. SeX
é uma matriz m por n,reshape(T*X(:),size(H)+[m n]-1)
é o mesmo queconv2(X,H)
.Isso obteria a mesma convolução resultante de,
conv2(X,H)
mas você ainda teria que retirar a parte correta da convolução.fonte
Eu escrevi uma função que resolve isso no meu repositório StackOverflow Q2080835 GitHub (Dê uma olhada
CreateImageConvMtx()
).Na verdade, a função pode suportar qualquer formato de convolução que você queira -
full
,same
evalid
.O código é o seguinte:
Aproveitar...
fonte