OpenCV-Sobel函数的手工实现

2024-10-01 19:20:18 发布

您现在位置:Python中文网/ 问答频道 /正文

My image

如果我有一个图像并调用OpenCV Sobel函数

Sobel(Img,gradX,CV_16S,1,0,3);
convertScaleAbs(gradX,absGradX);
imshow("Gradient Image",absGradX);

我得到了一个很好的渐变图像

我想使用filter2D和一个自定义内核来计算我的x梯度。我的sobel内核是 10-1号 20-2年 10-1号 现在当我尝试这个,我得到的只是一个全黑的图像

^{pr2}$

得到的渐变图像是全黑的。你知道我做错了什么吗? 谢谢


Tags: 函数图像imageimg内核opencvcvimshow
1条回答
网友
1楼 · 发布于 2024-10-01 19:20:18

实际上,我从你创建的一个自定义输出中得到了内核。我使用Python OpenCV来实现这一点,但是在OpenCV中调用函数的方式几乎相同。为了实现自包含,这是我使用Sobel和自定义内核为您的图像调用的Python代码:

import cv2
import numpy as np
im = cv2.imread('Nj9fM.png'); #// Save image to computer first

#// Call using built-in Sobel
out1 = cv2.Sobel(im, cv2.CV_16S, 0, 1, 3)
out1 = cv2.convertScaleAbs(out1.copy())

#// Create custom kernel
xVals = np.array([0.125,0,-0.125,0.25,0,-0.25,0.125,0,-0.125]).reshape(3,3)

#// Call filter2D
out2 = cv2.filter2D(im, cv2.CV_32F, xVals, None, (-1,-1), 0, cv2.BORDER_DEFAULT)
out2 = cv2.convertScaleAbs(out2.copy())

cv2.imshow('Output 1', out1)
cv2.imshow('Output 2', out2)
cv2.waitKey(0)
cv2.destroyAllWindows()
< C++ >:

^{pr2}$

如果您运行此代码,您将实际看到两个映像,其中第一个映像使用内置的Sobel,而另一个使用您的自定义内核。我在Sobel实现和梯度之间看到的主要区别是,您使用Sobel内核将每个元素除以8。因此,任何你检测到的梯度,你都会得到对比度降低,这就是我看到的。实际上,你基本上是把梯度结果除以8,所以你把输出强度降低了一倍。尝试执行:float xVals2[9] = {1f,0f,-1f,2f,0f,-2f,1f,0f,-1f};实际的Sobel内核,然后再次运行代码。相比之下,你应该会看到更高的提升。对于Python,这将是:

xVals2 = np.array([1.,0.,-1.,2.,0,-2.,1.,0,-1.]).reshape(3,3)
<>也在C++中:

Mat xVals2 = Mat_<float>(3, 3) << 1f, 0f, -1f, 2f, 0f, -2f, 1f, 0f, -1f;

如果你用这个内核运行你的代码,你会看到有一个更高的对比度。您将看到,虽然有更多的噪声,因为梯度值更大。在

相关问题 更多 >

    热门问题