卷积

卷积:目前能够理解的是卷积就是把模版与图像对应点相乘再相加,把最后的结果代替模版中心点的值的一种运算。opencv中函数cvFilter2D()可以对图像进行卷积运算。

#include "cv.h"  
#include "highgui.h"
#include <stdio.h>
int main()
{
IplImage *src=0;
IplImage*dst =0;
IplImage*dst2=0;
float k[9]={
1,2,1,
2,4,2,
1,2,1}; //高斯卷积3*3的核

for(int i = 0 ; i< 9;i++){
k[i] = float(k[i]/16);
}
CvMat Km;
Km = cvMat(3,3,CV_32F,k);

float k2[25] = {
1, 2, 3, 2, 1,
2, 5, 6, 5, 2,
3, 6, 8, 6, 3,
2, 5, 6, 5, 2,
1, 2, 3, 2, 1};//高斯卷积5*5的核
for(int j = 0 ; j<25; j++){
k2[j] = float(k2[j]/85);
}
CvMat Km2;
Km2 = cvMat(5,5,CV_32F,k2);
src=cvLoadImage("1.bmp",0);//Force to gray image
dst=cvCloneImage(src); //使用cvCloneImage时,dst无需初始化,直接复制
dst2 = cvCloneImage(src);
cvNamedWindow("src",CV_WINDOW_AUTOSIZE);
cvNamedWindow("filter3*3",CV_WINDOW_AUTOSIZE);
cvNamedWindow("filter5*5",CV_WINDOW_AUTOSIZE);

cvShowImage("src",src);

cvFilter2D(src,dst,&Km,cvPoint(-1,-1));
cvFilter2D(src, dst2, &Km2,cvPoint(-1,-1));
//卷积本身公式比较复杂,但是经过舍去高阶小量,简化后成为模板操作
cvShowImage("filter3*3",dst);
cvShowImage("filter5*5", dst2);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&dst);
cvReleaseImage(&dst2);
cvDestroyAllWindows();
return 0;
}

那为什么复杂的卷积定义能够转换为简单的加分和乘法??

http://www.cnblogs.com/slysky/archive/2011/11/25/2262899.html 这篇讲的很详细。

1.卷积为何而生?

线性空间只定义了向量的乘法和加法,没能定义向量之间的卷积运算,因此无法说明多项式的乘法。

2. 积分图像:计算某一矩形区域内所有像素的和。应该和lili师兄讲的那个区域求和表类似。

 

posted on 2012-03-26 16:50  拼装小火车  阅读(755)  评论(0编辑  收藏  举报