[CLPR] 卷积还是相关? - Opencv之filter2D探究

I am doing something about convolving images in Python and for sake of speed I chose opencv 2.4.9.

Opencv offers a way called filter2D to do this and here‘s its docs:http://docs.opencv.org/modules/imgproc/doc/filtering.html?highlight=filter2d#filter2d

In docs, it says:

Convolves an image with the kernel.

But I have doubts(caused by something else) so I make some experiments on it:

First, I make a normal 3x3 matrix a using numpy as:

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

Then, I make a 2x2 matrix b as the cornel as:

>>> b

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

Finally, in order to make it clear to see difference between convolve and correlate, rotate b by 180 degree and b will look like:

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

Now, All pre-work is done. We could begin the experiment.

Step 1. Use scipy.ndimage.convolvendconv = ndimage.convolve(a, b, mode = ‘constant‘)and ndconv is:

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

Convolution op will rotate b by 180 degree and do correlation using b on a. So ndconv[0][0] = 4*1+3*5+2*7+1*2 = 35, and ndconv[2][2] = 4*4+3*0+2*0+1*0 = 16

This result is correct.

Step 2. Use scipy.ndimage.correlatendcorr = ndimage.correlate(a, b, mode = ‘constant‘)and ndcorr is:

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

According to correlation‘s definition, ndcorr[0][0] = 1*0+2*0+3*0+4*1 = 4 because the border will expand by 0.

(Someone may be confused by the expandation‘s difference between conv and corr. It seems convolveexpand image in directions right and down while correlate in directions left and up.)

But this is not the point.

Step 3. Use cv2.filter2Dcvfilter = cv2.filter2D(a, -1, b) and cvfilter is:

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

If we ignore the border cases, we will find that what cv2.filter2D did is actually a correlation other than aconvolution! How could I say that?

because cvfilter[1..2][1..2] == ndcorr[1..2][1..2].

WEIRD, isn‘t it?

Could anyone be able to tell the real thing that cv2.filter2D do? Thanks a lot.

时间: 2024-10-12 07:08:41

[CLPR] 卷积还是相关? - Opencv之filter2D探究的相关文章

灰度图像--空域滤波 基础:卷积和相关

学习DIP第28天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

[CLPR]卷积神经网络的C++实现

文章翻译自: http://www.codeproject.com/Articles/16650/Neural-Network-for-Recognition-of-Handwritten-Digi 如何在C++中实现一个神经网络类? 主要有四个不同的类需要我们来考虑: 层 - layers 层中的神经元 - neurons 神经元之间的连接 - connections 连接的权值 - weights 这四类都在下面的代码中体现, 集中应用于第五个类 - 神经网络(neural network)

图像处理基本算法-卷积和相关

在执行线性空间滤波时,经常会遇到两个概念相关和卷积二者基本相似,在进行图像匹配是一个非常重要的方法.相关是滤波器模板移过图像并计算计算每个位置乘积之和的处理卷积的机理相似,但滤波器首先要旋转180度相关的计算步骤:(1)移动相关核的中心元素,使它位于输入图像待处理像素的正上方(2)将输入图像的像素值作为权重,乘以相关核(3)将上面各步得到的结果相加做为输出卷积的计算步骤:(1)卷积核绕自己的核心元素顺时针旋转180度(2)移动卷积核的中心元素,使它位于输入图像待处理像素的正上方(3)在旋转后的卷

SAR成像基础知识急救箱(一)卷积 相关 滤波器那些事儿

1 相关与卷积 1.1 相关 自相关定义: A(τ)=∫μ(t)μ(t+τ)dt 自相关的涵义是一个函数和平移后的自己的乘积的积分,注意自相关是平移量的函数.直观上理解:如果平移量为0,则对应上式的结果最大.对于如下式所示的信号: μ 1 (t)={10  for ∣ t∣≤T/2otherwise 对于T=1  ,对应的图形和自相关函数分别为: 可以这样理解:积分代表面积,所以函数平移之后与原来的自己再相乘再积分,即是看乘积函数与水平轴围成的面积.对于上式,可以想象的是,若平移量较大,大于1,

opencv:图像卷积

卷积基本概念 C++代码实现卷积 #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat src = imread("f:/images/lena.jpg"); if (src.empty()) { printf("Could not find the

(原)使用intel的ippiConv对图像进行卷积

转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5462631.html 参考网址: https://software.intel.com/zh-cn/node/504170 https://software.intel.com/en-us/node/599808 1 #include <opencv2/opencv.hpp> 2 #include <opencv2/highgui/highgui.hpp> 3 #include <

OpenCV图像平滑处理

图像平滑处理 目标 本教程教您怎样使用各种线性滤波器对图像进行平滑处理,相关OpenCV函数如下: blur GaussianBlur medianBlur bilateralFilter 原理 Note 以下原理来源于Richard Szeliski 的著作 Computer Vision: Algorithms and Applications 以及 Learning OpenCV 平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法. 平滑处理的用途有很多, 但是在本教程中我们仅仅关

SSE图像算法优化系列十一:使用FFT变换实现图像卷积。

本文重点主要不在于FFT的SSE优化,而在于使用FFT实现快速卷积的相关技巧和过程. 关于FFT变换,有很多参考的代码,特别是对于长度为2的整数次幂的序列,实现起来也是非常简易的,而对于非2次幂的序列,就稍微有点麻烦了,matlab中是可以实现任意长度FFT的,FFTW也是可以的,而Opencv则有选择性的实现了某些长度序列的变换,查看Opencv的代码,可以发现其只有对是4的整数次幂的数据部分采用了SSE优化,比如4.16.64.256.1024这样的序列部分,因此基4的FFT是最快的,而剩余

OpenCL 图像卷积 2

? 上一篇图像卷积 http://www.cnblogs.com/cuancuancuanhao/p/8535569.html.这篇使用了 OpenCV 从文件读取彩色的 jpeg 图像,进行边缘检测以后写回文件. ● 代码(没有使用局部内存优化) 1 // convolution.cl,核函数,应该和上一篇中无优化内核是一样的 2 __kernel void convolution(__read_only image2d_t sourceImage, __write_only image2d_