图像处理中的valid卷积与same卷积

valid卷积

在full卷积的卷积过程中,会遇到\(K_{flip}\)靠近I的边界(K矩阵与I矩阵),就会有部分延申到I之外,这时候忽略边界,只考虑I完全覆盖\(K_{flip}\)内的值情况,这个的过程就是valid卷积。一个高为H1,宽为W1的矩阵I与高为H2,宽为W2的矩阵K,在H1大于等于H2,W1大于等于W2的情况下,valid卷积的结果就是一个(H1-H2+1)*(W-W+1)的矩阵\(C_{valid}\)

\[C_{valid}与C_{full}的对应关系为: C_{valid} = C_{full}( Rect (W_{2}-1,H_{2}-1,W_{1}-W_{2}+1,H_{1}-H_{2}+1) ) \]

same卷积

无论是full卷积还是valid卷积都不会得到正好的尺寸,要么比原尺寸大要么比原尺寸小,这时就需要same卷积来解决这个问题。若想得到宽和高都正好的矩阵我们首先需要给\(K_{flip}\)一个锚点,将锚点放在(循环)图像矩阵的(r,c)处,((r,c)在矩阵之内),将对应位置的元素逐个相乘,最终将所有的积进行求和作为输出图像矩阵在(r,c)处的输出值。这个过程称为same卷积。
OpenCv函数copyMakeBorder的参数表

参数 解释
src 输入矩阵
dst 输出矩阵
top 上侧扩充的行数
bottom 下侧扩充的行数
left 左侧扩充的行数
right 右侧扩充的行数
borderType 边界扩充的类型
value border Type= BORDER_CONSTANT事的常数
其中borderType有多种类型,比如:BORDER_REPLICATE(边界复制)、BORDER_CONSTANT(常数扩充)、BORDER_REFLECT(反射扩充)等。
在使用Python进行卷积操作时用到包Scipy,其中有关的操作函数为convolve2d(in1,in2,mode='full',boundary='fill',fillvalue=0)
参数 解释
-- --
in1 输入数组
in2 输入数组,代表K(卷积算子)
mode 卷积类型,也就是以上提到的三种类型:full,valid,same
boundary 边界填充:fill\wrap\symm
fillvalue 当boundary='fill'时,设置边界填充的值,默认为0
在这里需要注意的是当model为same时卷积算子的锚点位置由不同尺寸而不同,假设K(卷积算子)的宽和高分别为W、H。
W和H的值 锚点位置
-- --
均为奇数 默认为中心点
H为偶数、W为奇数 (H-1,(W-1)/2)
H为奇数,W为偶数 ((H-1)/2,W-1)
均为偶数 (H-1,W-1)
代码实现:
import numpy as np
from scipy import signal

if __name__ == "__main__":

    I = np.array([[1,2],[3,4],np.float32])
    #I的高和宽
    H1,W1 = I.shape[:2]
    #卷积算子
    k = np.array([[-1,-2],[2,1],np.float32])
    #K的宽和高
    H2,W2 = k.shape[:2]
    #计算full卷积
    c_full = signal.convolve2d(I,k,mode='full')
    #设定锚点
    r,c = 0,0
    #根据锚点来从full卷积中截取same卷积
    c_same= c_full[H2-r-1:H1-r-1,W2-c-1:W1+W2-c-1]
posted @ 2020-06-20 18:15  Super~me  阅读(2714)  评论(0编辑  收藏  举报