我实现了一个Sobel边缘检测器,并提出了一些关于计算边缘方向的问题。
在做了sobel核卷积之后,我用这个函数来计算边缘强度。
Gxy = sqrt( pow(Gx,2) + pow(Gy,2) )
其中Gx是sobel核在X方向上卷积的和,Gy是sobel核在Y方向上卷积的和。(注意,在X和Y方向上的sobel核是不同的核)
Y内核:
X内核:
当我试图计算边缘方向(θ以度数表示)时,我使用以下规则:
我所有的文档都告诉我,角度应该是>0和< 360,并且我继续得到负值方向的边。在计算θ或卷积时,我是否做错了什么?或者我应该把360或180加到负θ值上呢?
提前谢谢,
发布于 2011-09-13 16:39:36
很难精确地回答你的问题,因为你没有确切地提到你是如何计算拱形函数的。
例如,如果您使用的是标准图书馆的atan函数,那么负角度是预期的。
此外,您还会注意到,带有单个参数的atan只能在第一象限和第四象限中返回值(例如,在使用度数时,可以返回tan 45 == tan 225 )。
如果您真的希望在四个象限中有一个角度(您真的应该问问自己,这对您的应用程序是否重要),那么请看一下atan2。
发布于 2015-11-19 15:19:05
如果使用的是OpenCV,则C++可以执行以下操作:
Mat gray = some grayscale image;计算x/y轴上的边缘梯度
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计算角度和震级
Mat Mag(gray.size(), CV_32FC1);
Mat Angle(gray.size(), CV_32FC1);
cartToPolar(dx, dy, Mag, Angle, true);https://stackoverflow.com/questions/7405223
复制相似问题