在opecv中,如何实现CImg的get_gradientXY

In opecv, how to implement get_gradientXY of CImg

本文关键字:CImg get gradientXY 实现 opecv 何实现      更新时间:2023-10-16

我目前正在使用OpenCV的接口实现CImg的功能,即get_gradientXY。我发现OpenCV中的cvSobel可能具有与get_gradientXY相同的效果,但在样本图上进行实验后,输出图完全不同。我受够了。

这是我的测试代码:

imgCv.Load("1.jpg");
imgCimg.Load("1.jpg");
IplImage* pSrcImage = imgCv.GetOpenCVImpPtr();//get pointer of src graph
IplImage* grad_x = cvCreateImage(cvGetSize(pSrcImage), pSrcImage->depth, 3);
IplImage* grad_y = cvCreateImage(cvGetSize(pSrcImage), pSrcImage->depth, 3);
cvSobel(pSrcImage,grad_x,1,0,3);
cvSobel(pSrcImage,grad_y,0,1,3);
std::string filename1 = "gradcvx.jpg";
std::string filename2 = "gradcvy.jpg";
cvSaveImage(filename1.data(), grad_x);
cvSaveImage(filename2.data(), grad_y);
//*****

cimg_library::CImgList<unsigned char> gradImages =  imgCimg.GetCImg().get_gradientXY(2);
gradImages[0].save("gradcimgx.jpg");
gradImages[1].save("gradcimgy.jpg");

gradcvx.jpg与gradcimgx.jpg完全不同。我想知道为什么。非常感谢。

您可以尝试使用CvFilter2d函数来实现Sobel filter,并检查它是否正确,然后使用内核进行实验。

以下是使用示例:http://feelmare.blogspot.ru/2013/01/cvfilter2d-example-source-code-various.html

您还可以创建两个测试图像,一个带有水平线,另一个带有垂直线,应用过滤器并查看像素值。可以手动计算的正确值。然后验证在每种情况下是否正确。