卷积操作的matlab实现
工作之余,脑海中突然蹦出“图像的卷积操作怎么实现呢?”,然后仔细考虑了以下实现细节,并记录下来,以备日后查看。
为了便于叙述和验证程序的有效性,这里贴出一张原图(图1)和它相应地经过均值核卷积以后的效果图(图2)。
图1. castle原始图片
图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