从结果里可以看到,当卷积使用full计算时,输出结果会比原来输入的图像变大,这样会破坏图像的大小,如果经过几遍这样的计算,图像就会变得非常大,有时候这种输出结果会导致问题出现。那么有没有输入图像与输出图像一样大小的卷积运算呢?是有的,就是same模式计算,如下图:
当卷积核的中心(K)与image的边角重合时,开始做卷积运算,可见卷积核的运动范围比full模式小了一圈。注意:这里的same还有一个意思,卷积之后输出的图像的尺寸保持不变(相对于输入图片)。当然,same模式不代表完全输入输出尺寸一样,也跟卷积核的步长有关系。
下面的例子演示相关的计算:
#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
#计算卷积
image = np.array([[1,2],[3,4]])
k = np.array([[-1,-2],[2,1]])
c_full = signal.convolve2d(image,k,mode='same')
print(c_full)
结果输出如下:
[[-1 -4]
[-1 -5]]
如果你把这个结果与full结果进行比较,会发现它是full输出矩阵的一个子集,因此same模式的结果都是可以由full模式的结果里直接取出来的。
接着下来,继续理解valid模式的计算方式,这个计算方式要求卷积核必需与图像有效元素进行计算,如下图所示:
可以看到k在输入图像的元素范围之内进行计算,因此valid计算结果输出图像大小会变小,用下面的例子代码来演示:
#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
#计算卷积
image = np.array([[1,2],[3,4]])
k = np.array([[-1,-2],[2,1]])
c_full = signal.convolve2d(image,k,mode='valid')
print(c_full)
结果输出如下:
[[-5]]
在函数convolve2d的参数里有三种填充方式,fill模式时,边界可以填充指定的值;当是wrap模式时,边界采用平铺的方式进行填充;当是symm时,边界采用反射扩充模式,相当于在图像边界作镜像。
https://blog.csdn.net/caimouse/article/details/51749579
转载:https://blog.csdn.net/caimouse/article/details/100655698
查看评论