【问题标题】:How to find normals to an edge in an image如何找到图像边缘的法线
【发布时间】:2014-10-26 20:07:18
【问题描述】:

我正在做一些与眼睛图像相关的工作。 我对它进行了边缘检测。边缘就像一条曲线而不是连续的。我必须假设它是连续的并找到该曲线的法线。如何使用 MATLAB 找到它的法线?

你可以看到下面的图片。

我想找到上曲线的法线。 我希望我已经足够清楚了。

【问题讨论】:

    标签: matlab image-processing edge-detection


    【解决方案1】:

    尽管看起来不直观,但每个像素的边缘方向是对法线的一个很好的估计。这将是最简单的解决方案,因为它不涉及任何曲线拟合。

    在 MATLAB 中,您可以使用 Sobel 滤波器找到逐像素的边缘方向:

    [BW,thresh,gv,gh] = edge(I,'sobel');
    edgeDir = atan2(gv, gh);
    

    这会以弧度为单位为您提供边缘方向。

    【讨论】:

    • 感谢您的回答。通过执行上述过程,我得到了每个像素的 edgeDir。我怎样才能只为上曲线(或下曲线)做到这一点?如何制作曲线的法线方程?
    • 要在任何边缘点将一条线拟合到法线,计算边缘方向 theta,将斜率计算为 m = tan(theta)。取边缘像素坐标 (x, y) 并求解方程 y = mx + c 以计算常数 c。然后你就有了法线方程。要区分上曲线和下曲线,您可能需要进行曲线拟合并比较曲线焦点的 y 坐标。
    • 非常感谢!!我明白了。你能帮我做曲线拟合吗?我没有找到任何与图像相关的东西。它只是为了几个点而给出的。如果您有任何链接,请发布它。
    【解决方案2】:

    您可能需要考虑对数据进行曲线拟合(基于 MSE 或其他一些标准)。我相信二阶对上曲线有好处,一旦你有了模型,你就可以计算每个点的切线和法线。

    【讨论】:

    • 你能详细描述一下我吗?我怎样才能只选择上面的曲线?我不认为要根据给出的行范围进行选择,因为对于某一行,两条曲线都存在。
    • 您可以尝试几种方法。您可以将图像拆分为子图像和阈值。您可以尝试拟合二阶模型,该模型将在它们之间找到某种“中心”线,然后选择该线上方的数字。
    • 你能告诉我如何将圆弧拟合到它。我想对较低的曲线进行曲线拟合(比如说)。我已经像你说的那样隔离了它。我想对其进行曲线拟合(圆形)
    【解决方案3】:

    正如赞福德建议的那样,法线垂直于边缘。不需要做曲线拟合,可以用反投影来识别曲线的焦点。

    从曲线的每个边缘点开始,从曲线沿法线方向画一条线。通过增加线穿过的每个像素的值来绘制线。一旦对所有边缘执行此操作,您将希望找到两个像素值高于其余像素,一个用于您的每条曲线。然后,您应该知道每个曲线的焦点位置。

    【讨论】:

    • 如何沿着曲线(上或下)遍历?你能告诉我如何通过一条曲线来从编码的角度画线吗?
    猜你喜欢
    • 2015-01-30
    • 2015-11-26
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多