首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sobel边缘检测,边缘定位

Sobel边缘检测,边缘定位
EN

Stack Overflow用户
提问于 2011-09-13 16:25:26
回答 2查看 6.5K关注 0票数 1

我实现了一个Sobel边缘检测器,并提出了一些关于计算边缘方向的问题。

在做了sobel核卷积之后,我用这个函数来计算边缘强度。

Gxy = sqrt( pow(Gx,2) + pow(Gy,2) )

其中Gx是sobel核在X方向上卷积的和,Gy是sobel核在Y方向上卷积的和。(注意,在X和Y方向上的sobel核是不同的核)

Y内核:

  • 1 2 1
  • 0 0 0
  • -1 -2 -1

X内核:

  • -1 0 1
  • -2 0 2
  • -1 0 1

当我试图计算边缘方向(θ以度数表示)时,我使用以下规则:

  • 如果Gy == 0和Gx == 0,则θ=0
  • 如果Gy = 0,Gx == 0,则θ= 90
  • 否则,θ= (arctan( Gy / Gx )* 180) / PI

我所有的文档都告诉我,角度应该是>0和< 360,并且我继续得到负值方向的边。在计算θ或卷积时,我是否做错了什么?或者我应该把360或180加到负θ值上呢?

提前谢谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-13 16:39:36

很难精确地回答你的问题,因为你没有确切地提到你是如何计算拱形函数的。

例如,如果您使用的是标准图书馆的atan函数,那么负角度是预期的。

此外,您还会注意到,带有单个参数的atan只能在第一象限和第四象限中返回值(例如,在使用度数时,可以返回tan 45 == tan 225 )。

如果您真的希望在四个象限中有一个角度(您真的应该问问自己,这对您的应用程序是否重要),那么请看一下atan2

票数 3
EN

Stack Overflow用户

发布于 2015-11-19 15:19:05

如果使用的是OpenCV,则C++可以执行以下操作:

代码语言:javascript
复制
    Mat gray = some grayscale image;

计算x/y轴上的边缘梯度

代码语言:javascript
复制
    Mat dx(gray.rows, gray.cols, CV_16SC1);
    Mat dy(gray.rows, gray.cols, CV_16SC1);
    int aperture_size=3;
    Sobel(gray, dx, CV_32FC1, 1, 0, aperture_size, 1, 0, BORDER_REPLICATE);
    Sobel(gray, dy, CV_32FC1, 0, 1, aperture_size, 1, 0, BORDER_REPLICATE);

用OpenCV的cartToPolar计算角度和震级

代码语言:javascript
复制
    Mat Mag(gray.size(), CV_32FC1);
    Mat Angle(gray.size(), CV_32FC1);
    cartToPolar(dx, dy, Mag, Angle, true);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7405223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档