【发布时间】:2014-08-19 20:20:55
【问题描述】:
如果我有图像并使用
调用 OpenCV Sobel 函数Sobel(Img,gradX,CV_16S,1,0,3);
convertScaleAbs(gradX,absGradX);
imshow("Gradient Image",absGradX);
我得到了一个漂亮的渐变图像
我想使用带有自定义内核的 filter2D 来计算我的 x 梯度。我的 sobel 内核是 1 0 -1 2 0 -2 1 0 -1 现在当我尝试这个时,我得到的只是一张全黑的图像
float xVals[9] = {.125,0,-.125,.25,0,-.25,.125,0,-.125};
Mat xKernel = Mat(3,3,CV_32F,xVals);
Mat gradXManual,absGradXManual;
filter2D(Img,gradXManual,-1,xKernel,Point(-1,-1),0,BORDER_DEFAULT);
convertScaleAbs(gradXManual,absGradXManual);
imshow("Manual Gradient",absGradXManual);
生成的渐变图像全黑。任何想法我做错了什么? 谢谢
【问题讨论】:
-
使用您的自定义内核,我得到一个输出。你能把你使用的图片放在这里吗?但是,我使用的是 Python OpenCV,但调用函数的方式实际上与 C++ 版本相同。我使用了我拥有的测试图像,并从 Sobel 和您的自定义内核中获得了输出。
-
有趣的是,我没有得到自定义内核的任何东西。我已经编辑了我的帖子以包含我使用的图片。
-
我现在去看看。给我一点时间。
-
我看到的 Sobel 实现和您的梯度之间的主要区别在于,您将 Sobel 核除以每个元素除以 8。因此,您检测到的任何梯度,您都会得到对比减少,这就是我所看到的。实际上,您基本上是在获取梯度结果并除以 8,因此您将输出强度降低了 8 倍。尝试执行以下操作:
float xVals[9] = {1f,0f,-1f,2f,0f,-2f,1f,0f,-1f};actual Sobel 内核,然后运行您的再次编码。您应该会看到更高的对比度提升。 -
啊,你是对的。我正在规范化,这导致对比度降低了太多。谢谢!
标签: python c++ opencv image-processing