numpy 如何稳定检测到的边缘/角点

sulc1iza  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(134)

我有一个基于边缘检测的问题。我在图像上生成一些线条,并计算沿着线条的梯度。我搜索的点是梯度的最小值。下图说明了我的意思:

下面是我如何计算点数的代码:

sub_img[:,] = median[y, a]
    cv2.line(img,(a,y[0]),(a,y[-1]),(0,0,255),3)
    grad= np.gradient(sub_img)
    edge = np.min(grad)
    y_point = np.where(grad == edge)

现在我遇到了以下问题:当我在相机流中应用我的代码时,我搜索的点的检测有大约1到2个像素的公差。
对于我的项目,我必须非常准确,我需要相同的迭代结果的流(场景是不动的)。你知道我如何才能稳定检测我的点?
我使用的是最适合我的高分辨率硬件等。所以请只提示哪些是基于软件或必要的数学。
提前感谢!

gg0vcinb

gg0vcinb1#

np.gradient使用有限差分近似来计算导数(除了第一个和最后一个点之外的中心差分)。这对噪声非常敏感。您可能需要在运算中添加一些正则化,以使其对噪声更加鲁棒。
在图像处理领域中定义了许多正则化导数算子。最著名的是Sobel算子。最好的一个in many different ways是高斯梯度算子。高斯是最佳正则化滤波器,其sigma参数控制正则化的量。
高斯梯度产生平滑图像的精确梯度。由于您正在测量的边缘是直的,因此平滑不会使其移位:局部极值将与边缘的位置精确匹配。
由于高斯正则化,局部极值将是平滑的,并且您将能够以亚像素精度确定其位置。实际精度仅取决于噪声量和正则化量。

相关问题