为“相同”的卷积形状生成 2D 内核的卷积矩阵

信息处理 图像处理 matlab 计算机视觉 卷积
2022-01-01 08:41:22

我想为某个 2D 内核找到一个卷积矩阵H.
例如,对于Img大小的图像m×n,我想要(在 MATALB 中):

T * Img = reshape(conv2(Img, H, 'same'), [], 1);

T卷积矩阵在哪里,same表示卷积形状(输出大小)与输入大小匹配。

理论上,H 应该转换为 toeplitz 矩阵,我使用的是 MATLAB 函数convmtx2()

T = convmtx2(H, m, n);

然而T大小不一(m+2)(n+2)×(mn)因为 MATLAB 会convmtx2生成一个与 的卷积形状相匹配的卷积矩阵full

有没有办法生成conv2()same卷积形状参数匹配的卷积矩阵?

2个回答

我无法在我的计算机上测试这个,因为我没有 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)但是您仍然必须拉出正确的卷积部分。

我在我的StackOverflow Q2080835 GitHub 存储库中编写了一个函数来解决这个问题(看看CreateImageConvMtx())。
实际上,该函数可以支持您想要的任何卷积形状-full.samevalid

代码如下:

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

享受...