图像处理中的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(W2−1,H2−1,W1−W2+1,H1−H2+1))
same卷积
⽆论是full卷积还是valid卷积都不会得到正好的尺⼨,要么⽐原尺⼨⼤要么⽐原尺⼨⼩,这时就需要same卷积来解决这个问题。若想得到宽和⾼都正好的矩阵我们⾸先需要给K flip⼀个锚点,将锚点放在(循环)图像矩阵的(r,c)处,((r,c)在矩阵之内),将对应位置的元素逐个相乘,最终将所有的积进⾏求和作为输出图像矩阵在(r,c)处的输出值。这个过程称为same卷积。
OpenCv函数copyMakeBorder的参数表
参数解释
valid from是什么意思
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 = volve2d(I,k,mode='full')
#设定锚点
r,c = 0,0
#根据锚点来从full卷积中截取same卷积Processing math: 100%
c_same= c_full[H2-r-1:H1-r-1,W2-c-1:W1+W2-c-1]
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论