概念
相关
卷积:
相关重在表示两件事物之间存在的关联性,而卷积这一改念,更多是信号的叠加概念,参考下面链接
卷积-知乎
实现
围绕opencv的filter2D实现相关和卷积操作
CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth,
InputArray kernel, Point anchor = Point(-1,-1),
double delta = 0, int borderType = BORDER_DEFAULT );
注意到头文件的一段说明
The function does actually compute correlation, not the convolution:
That is, the kernel is not mirrored around the anchor point. If you need a real convolution, flip
the kernel using cv::flip and set the new anchor to `(kernel.cols - anchor.x - 1, kernel.rows -
anchor.y - 1)`.
说明filter2D实际做的操作是相关计算,而非卷积计算。我们常见的sobel算子(3x3大小)
使用cv::flip函数得到实际上的卷积顺序
利用filer2D实现相关计算和卷积计算
以lena灰度图为例子
相关输出
卷积输出
实际上,从这一结果更明显看出的是相关性,图中鼻子高量部分,在sobel算子的相关计算中,显现了出来,以为实际灰度图上的鼻子部分,在opencv 图像的x轴向也是由暗变亮的。
opencv也可以实现简单的图像卷积操作,本实验中得到的单层卷积效果和相关的结果区别不大,但不等同于相关。卷积在神经网络中由更为广泛的应用。
上述操作实现的代码
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char **argv)
{
Mat image;
printf("%d \n", argc);
if(argc > 1)
{
image = imread(argv[1]);
}
else
{
image = imread("../res/lena.jpg");
}
Mat gray;
cvtColor(image, gray, CV_RGB2GRAY);
imshow("in", gray);
// sobel
Mat sobel_x = (cv::Mat_<float>(3,3) << -1,0,1,-2,0,2,-1,0,1);
Mat sobX;
filter2D(gray, sobX, -1, sobel_x);
imshow("sobel x", sobX);
cout << sobel_x << endl;
flip(sobel_x, sobel_x, -1);
cout << sobel_x << endl;
filter2D(gray, sobX, -1, sobel_x);
imshow("sobel x2", sobX);
waitKey(0);
return 0;
}