图像卷积原理

卷积

代码

%卷积函数
%made by yao
function result = myconv(kernel,img)
    [k,num] = size(kernel);
    %判断传入的数组是否为双精度浮点型,否则进行类型转换
    if ~isa(img,'double')
        p1 = double(img);
    else
        p1 = img;
    end
    %提取尺寸
    [m,n] = size(p1);
    %构造卷积之后的模板
    %这里考虑到边缘的问题,所以把黑边裁剪掉了
    result = zeros(m-k+1,n-k+1);
    for i = ((k-1)/2+1):(m-(k-1)/2)
        for j = ((k-1)/2+1):(n-(k-1)/2)
            result(i-(k-1)/2,j-(k-1)/2) = sum(sum(kernel .* p1(i-(k-1)/2:i+(k-1)/2,j-(k-1)/2:j+(k-1)/2)));
        end
    end
end

这里举个例子,比方说我们有3x3的卷积核,对图像进行卷积,那么在(1,1)的时候,就会连带着对图像边缘外面(包括上边一行和左边的一列,同理图像下边和右边也会出现同样的情况)。
所以为了避免这种情况,就要把3x3的卷积核卷积的起始点定在(2,2)处。若图像有m列n行,那么一行的卷积终止出就在n-1出,一列的卷积终止点在m-1处。
同理,5x5以及更长的卷积核也是同样的操作。
5x5的卷积核起始点在(3,3),终止点(m-2,n-2)。
所以对于奇数的卷积核,设卷积核长度为k,那么起始卷积点就是((k-1)/2+1),终止点(m-(k-1)/2)(行列都是一样的,换一下就好)。

文章目录