我正在做一些关于用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怎么办?谢谢。
我认为OpenCV也是如此。如果您想根据数字图像处理理论进行真正的卷积,则应在应用cv2之前手动反转内核。过滤器2D
。
如果您进一步阅读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”只打印一次(