我需要做一个二维卷积。我有一个形状100, 100
的相似矩阵和一个形状5,5
的过滤器。
如果我用的是枕木:
scipy.signal.convolve2d(similarity_matrix, np.diag(filter))
我得到104,104
矩阵作为回应。
但如果我真的使用OpenCV的filter2D方法:
cv2.filter2D(similarity_matrix, -1, np.diag(filter))
我得到一个100,100
矩阵作为回应。
发布于 2019-11-09 08:00:18
scipy.signal.convolve2d的默认输出模式是完全卷积。如果希望输出大小与输入大小相同,请将模式参数设置为“相同”。
scipy.signal.convolve2d(similarity_matrix, np.diag(filter), mode="same")
更新:当您将图像与内核进行转换时,您不能直接计算图像边缘的卷积结果,因为有一些邻居丢失了。解决这个问题有不同的方法。
忽略边缘的值,例如。如果内核是3x3,忽略边缘的元素,如果内核是5x5,忽略边缘的最后2个元素,以此类推。
2-对图像应用某种填充,意思是以特定的方式暂时放大图像,这样就可以将卷积核应用到边缘的值上。同样,也有不同的方法(这一次超过2),但最基本的方法是零填充。例如,如果图像大小为100x100,而内核为5x5,则在图像的每一侧(右、上、左、下),由于缺少邻居,我们无法计算两个外部值的卷积。使用零填充方法,您首先将图像放大到104x104。这个放大的图像是由你原来的100x100图像的中心和一些零的值添加到边缘,现在的主要事情是,现在你可以应用你的过滤器到100x100区域,因为你为边缘值创建了人工邻居。
关于模式名称:
1-如果您选择“填充方式”,并保持您的输出大小与您的输入大小相同,它称为相同的卷积。使用上面的填充方法,这是通过在放大图像上删除外部值来完成的。
如果你选择“忽略边值法”进行卷积,你的输出就会变小。这被称为有效卷积。顾名思义,您只对“有效”区域执行卷积操作。
3-如果您选择“填充方式”,并保留附加值,它称为完全卷积。请注意,通过裁剪输出的全卷积,您也可以获得相同和有效的卷积。
https://stackoverflow.com/questions/58777438
复制相似问题