Img
,我想要(在MATALB中):T * Img = reshape(conv2(Img, H, 'same'), [], 1);
其中
T
是卷积矩阵,same
表示卷积形状(输出大小)与输入大小匹配。理论上,H应该转换为托普兹矩阵,I我正在使用MATLAB函数
convmtx2()
:T = convmtx2(H, m, n);
T
的大小为$(m + 2)(n + 2)\ times(mn)$作为MATLAB的convmtx2
生成与full
的卷积形状相匹配的卷积矩阵。是否可以生成与
conv2()
的卷积形状参数相匹配的卷积矩阵?#1 楼
我无法在计算机上对此进行测试,因为我没有convtmx2函数,这是MATLAB帮助说的内容:http://www.mathworks.com/help/toolbox/images/ref/ convmtx2.html
T = convmtx2(H,m,n)
返回矩阵T
的卷积矩阵H
。如果X
是m×n矩阵,则reshape(T*X(:),size(H)+[m n]-1)
与conv2(X,H)
相同。这将得到与
conv2(X,H)
相同的结果卷积,但是您仍然必须取出正确的卷积。评论
$ \ begingroup $
欢迎使用DSP.SE,这是一个很好的答案!
$ \ endgroup $
– Phonon
2012年3月29日在2:37
$ \ begingroup $
我认为有时需要一个实际的矩阵来对其进行分析(伴随运算符,逆运算符等)。因此,该方法将不起作用(除非您开始从矩阵中删除行,因为行稀疏会很慢)。
$ \ endgroup $
–罗伊
19年1月17日在15:05
#2 楼
我在StackOverflow Q2080835 GitHub Repository中编写了一个解决此问题的函数(请看CreateImageConvMtx()
)。实际上,该函数可以支持您想要的任何卷积形状-
full
,same
和valid
。代码如下:
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
享受...
评论
您只是想获得相同的结果T * Img还是想将T用于其他目的?我编辑了您的代码和数学,因此看起来更有吸引力。您可以自己解决以后的问题。对于Latex编辑,请使用$$。
相关问题-dsp.stackexchange.com/questions/17418。