我想为某个2D内核$ H $找到一个卷积矩阵。例如,对于大小为$ m \ times n $的图像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()的卷积形状参数相匹配的卷积矩阵?

评论

您只是想获得相同的结果T * Img还是想将T用于其他目的?

我编辑了您的代码和数学,因此看起来更有吸引力。您可以自己解决以后的问题。对于Latex编辑,请使用$$。

相关问题-dsp.stackexchange.com/questions/17418。

#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())。
实际上,该函数可以支持您想要的任何卷积形状-fullsamevalid

代码如下:



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


享受...