Matlab conv2有效实现

问题描述 投票:0回答:1

我正在尝试为我的C ++项目实现covn2有效实现。我试图先在matlab中编写代码。

function convolution= cov2(A, h)
[r1 c1] = size(A);
[r2 c2] = size(h);
center = floor((r2+1)/2);
convolution= zeros(r1-center , c1-center);
for row = 1: r1-center
    for column =1:r1-center
        for i=1:r2
            for j=1:r2
        convolution(row,column) = convolution(row,column) + (h(i,j)*A(i+row-1, j+column-1)); 
            end
        end
    end
end
end

我不确定现在该怎么办。请帮助我的代码。假设内核是具有奇数尺寸的正方形。 (11 * 11)或(7 * 7)同样

matlab
1个回答
0
投票

您的MATLAB实现有两个我可以看到的直接问题。第一个问题是j循环的限制应为for j=1:c2,而不是for j=1:r2,后者仅对非正方形内核有效;第二个问题是,应为图像卷积添加边界检查以简化实现并避免出现像您现在这样的错误。

此外,正如您在代码中所指出的那样,2D卷积会更改矩阵的大小,但是如果您希望保持大小不变​​,则始终可以根据内核的大小填充原始图像,然后再进行处理。

有了这,我将如何更新您的代码:

function convolution= Test_Conv(A, h)

[r2, c2] = size(h);
% Let's pad your image to avid sharp edges and keep the image size the same:
A = padarray(A, [r2 c2], 'replicate'); 
[r1, c1] = size(A);
center_1 = floor((r2+1)/2);
center_2 = floor((c2+1)/2);

convolution= zeros(r1-center_1 , c1-center_2);

for row = 1: r1-center_1
    for column =1:r1-center_2
        for i=1:r2
            for j=1:c2
                if( i+row-1 <= r1-center_1 && j+column-1 <= c1-center_2 )
                    convolution(row,column) = convolution(row,column) + (h(i,j)*A(i+row-1, j+column-1)); 
                end
            end
        end
    end
end

% Get rid of the extra margin we introduced before
convolution = convolution(r2:r1-r2-1, c2:r1-c2-1);

end

我建议的测试是应用几个众所周知的内核来检查您的代码,请注意,您始终可以将它们与MATLAB的内置2D convolution进行比较。让我们将几个众所周知的内核应用于Shepp-Logan phantom。考虑以下三个内核:

  • 身份内核:

以]形式的内核>

h = [0 0 0;0 1 0;0 0 0];

基本上不会改变图像。

  • 边缘检测内核:
  • 喜欢这个

h = [0 1 0;1 -4 1;0 1 0];

旨在锐化图像的边缘。

  • 锐化内核
  • 将锐化图像并具有形式

h = [0 -1 0;-1 5 -1;0 -1 0];

将图像以P的形式存储在变量P = phantom('Modified Shepp-Logan',200);中的200 x 200图像中,并通过out = Test_Conv(P, h);应用上述内核产生:

Shepp-Logan colnvolved with different kernels

© www.soinside.com 2019 - 2024. All rights reserved.