卷积:连续空间的卷积定义是f(x)与g(x)的卷积是f(t-x)g(x)在t从负无穷到正无穷的积分值。t-x要在f(x)定义域内,所以看上去很大的积分实际上还是在一定范围的。
实际的过程就是f(x)先做一个Y轴的反转,然后再沿X轴平移t就是f(t-x),然后再把g(x)拿来,两者乘积的值再积分。想象一下如果g(x)或者f(x)是个单位的节约函数,那么就是f(t-x)与g(x)相交部分的妙计。这就是卷积了。
把积分符号换成求和就是离散空间的卷积定义了。那么在图像中卷积的意思就是图像f(x),模板g(x),然后将模板g(x)在图像中移动,每到一个位置,就把f(x)与g(x)的定义域相交的元素进行乘积并且求和,得出新的图像一点,就是被卷积后的图像。模板又称卷积核。卷积核做一个矩阵的形状。
Filter2D
对图像做卷积
void cvFilter2D( const CvArr* src, CvArr* dst,
const CvMat* kernel,
CvPoint anchor=cvPoint(-1,-1));
src
输入图像.
dst
输出图像.
kernel
卷积核, 单通道浮点矩阵. 如果想要应用不同的核于不同的通道,先用 cvSplit 函数分解图像到单个色彩通道上,然后单独处理。
anchor
核的锚点表示一个被滤波的点在核内的位置。 锚点应该处于核内部。缺省值 (-1,-1) 表示锚点在核中心。
函数 cvFilter2D 对图像进行线性滤波,支持 In-place 操作。当核运算部分超出输入图像时,函数从最近邻的图像内部象素插值得到边界外面的象素值。
例:核为锐化滤波器实现图像锐化
#include #include int main(int argc, char ** argv) { IplImage* src, *dst; src = cvLoadImage( \"1.jpg\" ); dst = cvCreateImage( cvGetSize(src), src->depth, src->nChannels ); float k[9] = { 0, -1, 0, -1, 5, -1, 0, -1, 0 }; //核 CvMat km = cvMat( 3, 3, CV_32FC1, k ); cvFilter2D(src, dst, &km); cvNamedWindow( \"src\"); cvShowImage( \"src\ cvNamedWindow( \"Filter\"); cvShowImage( \"Filter\ cvWaitKey(0); cvReleaseImage( &src ); cvReleaseImage( &dst ); return 0; } 结果: 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- haog.cn 版权所有 赣ICP备2024042798号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务