第一步:开辟两个和原始图像一样大小的图像内存区,只是
其深度为IPL_DEPTH_16S,假设原始图像为pSrc(iplimage结构)
IplImage *p16SX = cvCreateImage(cvSize(pSrc->width,pSrc->height)
,IPL_DEPTH_16S,1);
IplImage *p16SY = cvCreateImage(cvSize(pSrc->width,pSrc->height)
,IPL_DEPTH_16S,1);
p16SX->origin = pSrc->origin;
p16SY->origin = pSrc->origin;
第二步:调用cvSobel进行边缘计算
cvSobel(pSrc,p16SX,1,0,3);//x方向的边缘
cvSobel(pSrc,p16SY,0,1,3);//y方向的边缘
第三步:计算sqrt(x^2+y^2),得到幅值图像
cvMul(p16SX,p16SX,p16SX,1.0);
cvMul(p16SY,p16SY,p16SY,1.0);
cvAdd(p16SX,p16SY,p16SX,0);
最后一步:将16S图像转化成8bit图像
cvConvert(p16SX,pDst);
或者使用:
IplImage *sobel8u=cvCreateImage(cvGetSize(pSrc),IPL_DEPTH_8U,1);
cvConvertScaleAbs(p16SX,sobel8u,1,0);
两点说明:
1、如果对时间要求不太高,建议在做完第二步后,第三步之前,
将得到的16S图像转换成32F图像,这样得到的结果会更加精确。
2、第三步中cvAdd,你可以另外开辟一个内存区存放结果,
转自:http://www.newsmth.net/nForum/#!article/Graphics/29028