小言_互联网的博客

在OpenCV里实现二维离散卷积3

602人阅读  评论(0)

从结果里可以看到,当卷积使用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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场