首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >convolve2d与filter2D的差异。为什么输出形状有差异?

convolve2d与filter2D的差异。为什么输出形状有差异?
EN

Stack Overflow用户
提问于 2019-11-09 07:57:20
回答 2查看 3.4K关注 0票数 0

我需要做一个二维卷积。我有一个形状100, 100的相似矩阵和一个形状5,5的过滤器。

如果我用的是枕木:

代码语言:javascript
运行
复制
scipy.signal.convolve2d(similarity_matrix, np.diag(filter))

我得到104,104矩阵作为回应。

但如果我真的使用OpenCV的filter2D方法:

代码语言:javascript
运行
复制
cv2.filter2D(similarity_matrix, -1, np.diag(filter))

我得到一个100,100矩阵作为回应。

  • 这里发生了什么事?为什么形状不同?
  • 使用convolve2d,为什么我会得到额外的4行和4列?
EN

Stack Overflow用户

发布于 2019-11-09 08:00:18

scipy.signal.convolve2d的默认输出模式是完全卷积。如果希望输出大小与输入大小相同,请将模式参数设置为“相同”。

代码语言:javascript
运行
复制
scipy.signal.convolve2d(similarity_matrix, np.diag(filter), mode="same")

更新:当您将图像与内核进行转换时,您不能直接计算图像边缘的卷积结果,因为有一些邻居丢失了。解决这个问题有不同的方法。

忽略边缘的值,例如。如果内核是3x3,忽略边缘的元素,如果内核是5x5,忽略边缘的最后2个元素,以此类推。

2-对图像应用某种填充,意思是以特定的方式暂时放大图像,这样就可以将卷积核应用到边缘的值上。同样,也有不同的方法(这一次超过2),但最基本的方法是零填充。例如,如果图像大小为100x100,而内核为5x5,则在图像的每一侧(右、上、左、下),由于缺少邻居,我们无法计算两个外部值的卷积。使用零填充方法,您首先将图像放大到104x104。这个放大的图像是由你原来的100x100图像的中心和一些零的值添加到边缘,现在的主要事情是,现在你可以应用你的过滤器到100x100区域,因为你为边缘值创建了人工邻居。

关于模式名称:

1-如果您选择“填充方式”,并保持您的输出大小与您的输入大小相同,它称为相同的卷积。使用上面的填充方法,这是通过在放大图像上删除外部值来完成的。

如果你选择“忽略边值法”进行卷积,你的输出就会变小。这被称为有效卷积。顾名思义,您只对“有效”区域执行卷积操作。

3-如果您选择“填充方式”,并保留附加值,它称为完全卷积。请注意,通过裁剪输出的全卷积,您也可以获得相同和有效的卷积。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58777438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档