我已经实施了Sobel边缘检测器,并且对计算边缘方向有一些疑问。
在完成sobel内核卷积后,我正在使用此函数计算边缘强度。
Gxy = sqrt(pow(Gx,2)+ pow(Gy,2))
其中Gx是Sobel核心在X方向上的卷积的总和,而Gy是Sobel核心在Y方向上的卷积的总和。 (注意,X和Y方向的sobel内核是不同的内核)
Y内核:
X内核:
当我尝试计算边缘方向(theta以度为单位)时,我使用以下规则:
我的所有文档都告诉我角度应该是> 0和< 360和我继续获得负值方向的边缘。在计算theta或我的卷积时,有什么我做错了吗?或者我应该将负值θ值加上360或180?
提前感谢,
答案 0 :(得分:3)
很难准确回答你的问题,因为你没有准确提到你如何计算arctan函数。
例如,如果您使用的是standard library's atan function,那么就会出现负角度。
此外,您会注意到具有单个参数的atan
只能返回第一和第四象限中的值(例如,因为使用度数时为tan 45 == tan 225
)。
如果你真的想要在四个象限中的一个角度(你应该问自己这对你的应用是否重要),那么看看atan2。
答案 1 :(得分:0)
如果您使用的是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);