怎么在c++的平台下用opencv做一个对图像的卷积?????
用下列模板[1,2,1;0,0,0;-1,-2,-1],还有[1,1,1;1,-8,1;1,1,1],麻烦高手指点~~~~~~...
用下列模板[1,2,1;0,0,0;-1,-2,-1],还有[1,1,1;1,-8,1;1,1,1],麻烦高手指点~~~~~~
展开
2个回答
展开全部
利用函数cvFilter2D
该函数的原型为:( const CvArr* src, CvArr* dst,const CvMat* kernel,CvPoint anchor=cvPoint(-1,-1));
src :输入图像.
dst:输出图像.
kernel:卷积核, 单通道浮点矩阵. 如果想要应用不同的核于不同的通道,先用 cvSplit 函数分解图像到单个色彩通道上,然后单独处理。
anchor :核的锚点表示一个被滤波的点在核内的位置。 锚点应该处于核内部。缺省值 (-1,-1) 表示锚点在核中心。
函数 cvFilter2D 对图像进行线性滤波,支持 In-place 操作。当核运算部分超出输入图像时,函数从最近邻的图像内部象素插值得到边界外面的象素值。
该函数的原型为:( const CvArr* src, CvArr* dst,const CvMat* kernel,CvPoint anchor=cvPoint(-1,-1));
src :输入图像.
dst:输出图像.
kernel:卷积核, 单通道浮点矩阵. 如果想要应用不同的核于不同的通道,先用 cvSplit 函数分解图像到单个色彩通道上,然后单独处理。
anchor :核的锚点表示一个被滤波的点在核内的位置。 锚点应该处于核内部。缺省值 (-1,-1) 表示锚点在核中心。
函数 cvFilter2D 对图像进行线性滤波,支持 In-place 操作。当核运算部分超出输入图像时,函数从最近邻的图像内部象素插值得到边界外面的象素值。
追问
看不是很懂,麻烦给我一个完整的代码,谢谢了~~~~~~~~高手~~~~~
追答
int main( int argc, char** argv )
{
IplImage *src = 0, *dst = 0, *dst2 = 0;
/*float k[9] = { 0, 1, 0,
1,-4, 1,
0, 1, 0}; */
float k[9] = { 1.f/16, 2.f/16, 1.f/16,
2.f/16, 4.f/16, 2.f/16,
1.f/16, 2.f/16, 1.f/16}; // 这里高斯核滤波器归一化
CvMat Km;
//cvInitMatHeader( &Km, 3, 3, CV_32FC1, k, CV_AUTOSTEP );
Km = cvMat( 3, 3, CV_32F, k );
// 0: force to gray image
src = cvLoadImage("lena.jpg", 0);
dst = cvCloneImage( src );
cvNamedWindow("src", 0);
cvShowImage("src",src);
cvNamedWindow("filtering", 0);
cvFilter2D( src, dst, &Km, cvPoint(-1,-1));
cvShowImage("filtering",dst);
cvWaitKey(0);
cvReleaseImage( &src );
cvReleaseImage( &dst );
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询