当前位置: 首页 > 知识库问答 >
问题:

opencv中的filter2D真的完成了它的工作吗?

燕实
2023-03-14

我正在做一些关于用Python卷积图像的事情,为了提高速度,我选择了opencv 2.4.9。

OpenCV提供了一种叫做Filter2D的方法来做到这一点,这是它的文档:http://docs.opencv.org/modules/imgproc/doc/filtering.html?highlight=filter2d#filter2d

在文档中,它说:

将映像与内核卷积。

但我有疑问(由其他原因引起),所以我对它做了一些实验:

首先,我使用numpy创建一个正常的3x3矩阵a,如下所示:

  [[ 1.,  5.,  0.], 
   [ 7.,  2.,  9.], 
   [ 2.,  3.,  4.]]

然后,我将2x2矩阵b作为内核,如下所示:

  [[ 1.,  2.],
   [ 3.,  4.]]

最后,为了清楚地看到卷积和相关之间的区别,将b旋转180度,b将如下所示:

  [[ 4.,  3.],
   [ 2.,  1.]]

现在,所有的准备工作都完成了。我们可以开始实验了。

第一步。使用scipy。ndimage。卷积:ndconv=ndimage。卷积(a,b,模式=常数)和ndconv为:

  [[ 35.,  33.,  18.],
   [ 41.,  45.,  44.],
   [ 17.,  24.,  16.]]

卷积运算op将b旋转180度,并使用a上的b进行相关。因此ndconv[0][0]=4*13*52*71*2=35,ndconv[2][2]=4*43*02*01*0=16

这个结果是正确的。

第二步。使用scipy。ndimage。关联:ndcorr=ndimage。关联(a、b、模式=常数)和ndcorr为:

  [[  4.,  23.,  15.],
   [ 30.,  40.,  47.],
   [ 22.,  29.,  45.]]

根据相关性的定义,ndcorr[0][0]=1*0 2*0 3*0 4*1=4,因为边界将扩展0。

(有些人可能会被conv和corr之间的展开差异弄糊涂。似乎是在右下方向上卷积展开图像,而在左上方向上关联。)

但这不是重点。

第三步。使用cv2。filter2D:cvfilter=cv2。过滤器2D(a,-1,b)和cvfilter是:

  [[ 35.,  34.,  35.],
   [ 41.,  40.,  47.],
   [ 33.,  29.,  45.]]

如果我们忽略边界情况,我们会发现cv2.filter2D所做的实际上是卷积之外的相关性!我怎么能这么说?

因为cvfilter[1..2][1..2]==ndcorr[1..2][1..2]。

很奇怪,不是吗?

有人能说出cv2的真实情况吗。过滤器2D怎么办?谢谢。

共有2个答案

毛宏达
2023-03-14

我认为OpenCV也是如此。如果您想根据数字图像处理理论进行真正的卷积,则应在应用cv2之前手动反转内核。过滤器2D

仲绍晖
2023-03-14

如果您进一步阅读OpenCV文档中的描述:

该函数实际上计算相关性,而不是卷积:

也就是说,内核不在锚点周围镜像。如果您需要一个真正的卷积,请使用Flyff()翻转内核,并将新锚设置为(kernel.cols-anchor. x-1,kernel.rows-anchor. y-1)

 类似资料:
  • 主要内容:示例Filter2D操作将图像与内核进行卷积。可以使用类的方法在图像上执行此操作。 以下是这种方法的语法 - 该方法接受以下参数 - src - 表示此操作的源(输入图像)的对象。 dst - 表示此操作的目标(输出图像)的对象。 ddepth - 表示输出图像深度的整数类型变量。 kernel - 表示卷积核的对象。 示例 以下程序演示如何在给定图像上执行Filter2D滤镜操作。 假定以下是上述程

  • 问题内容: 我无法在Windows上为OpenCV(Python)自动完成工作。 根据此处的Abid的说明,我将cv2.pyd文件粘贴到C:\Python27 \ Lib \ site-packages中。 在Python代码中,我如下导入: 我还安装了numpy,它在站点包中创建了自己的文件夹,这与OpenCV不同(我直接将其粘贴到站点包中)。 使用此设置,即使调用OpenCV方法,代码也不会出

  • 我正在使用来运行我的Spark作业。它运行正常,但是打开Spark webUI,我看不到已完成列表中的作业。 注意:Spark版本2.0.1,1个工作进程运行,本地主机上的主UI:8080,工作进程和主进程都从运行/sbin/启动-*。sh脚本。

  • 主功能仅输出1、2和3。为什么run中的Runnable不能同时运行和打印4? 但是,当我改变doWhat函数如下所示,所有的数字1,2,3和4将被打印。

  • 嗯,在程序中,我用在应用程序计费。在< code > query ventoryfinished listener 之后,我想更改用户界面。所以我做成了这样。但是它给出了这个错误。 E/AndroidRuntime(26593): FATAL EXCEPTION: AsyncTask #1 E/AndroidRuntime(26593): java.lang.RuntimeException: 执

  • 我和Nodejs一起工作。我有一个异步,因为我必须等待内部的结果。因此,我需要等待foreach完成,然后继续循环的结果。我找到了几个等待的解决方案,其中一个是使用promise。虽然我这样做了,这些promise是创建的,但是,代码后的每个(因此promise)完成,从来没有实际执行(console.log没有打印)。NodeJS函数结束时没有任何错误。 这是我的密码: “here”只打印一次(