卷积操作的matlab实现

工作之余,脑海中突然蹦出“图像的卷积操作怎么实现呢?”,然后仔细考虑了以下实现细节,并记录下来,以备日后查看。

为了便于叙述和验证程序的有效性,这里贴出一张原图(图1)和它相应地经过均值核卷积以后的效果图(图2)。

卷积操作的matlab实现

                                                                              图1. castle原始图片

卷积操作的matlab实现

                                                                                   图2. castle经过均值核卷积后的结果

matlab代码:

function conv_img = conv2_op(img,filter,padding,stride)

% convolution for 3D image

%         img : rgb or gray image, pixel value scaled in [0,1].

%        filter : convolution kernenl.

%  padding : padding size.

%      stride : filter move step size.

[h,w,c] = size(img);

ker_sz  = size(filter);

Size = floor( ([h,w]-size(filter)+2*padding)/stride )+1;

padding_img = zeros(h+2*padding,w+2*padding,c);

padding_img(padding+1:end-padding,padding+1:end-padding,:) = img;

conv_img = zeros([Size,c]);

% deal with filter

if c == 3    filter = repmat(filter,[1,1,3]);   end

row_idx = 1:stride:size(padding_img,1);

col_idx = 1:stride:size(padding_img,2);

% 主要思路:conv_img每个位置(row,col)的值,要在padding_img上找到相应的被卷积块,然后和filter进行卷积。

for row = 1:Size(1)

    up    = row_idx(row);

    down  = up+ker_sz(2)-1;

    for col = 1:Size(2)

        left  = col_idx(col);

        right = left+ker_sz(1)-1;

        conv_img(row,col,:) = sum(reshape(padding_img(up:down,left:right,:).*filter,prod(ker_sz),[]),1);

    end

end

end

卷积操作的matlab实现