无法在圆检测的霍夫变换中正确计算 [a, b] space
Unable to properly calculate [a, b] space in Hough transformation for circle detection
在[a,b]中进行累加的函数代码space
- minr:最小半径。
- maxr:最大半径。
- 量级:使用 Sobel 进行边缘检测后的二进制输出。
渐变:方向图。用 'atan(Ix./Iy)' 计算,其中 Ix 是水平的,Iy 是垂直的。
function [A] = accumulation(minr, maxr, magnitude, gradient)
[rows, cols, ~] = size(magnitude);
A = zeros(rows, cols, maxr);
for row = 1:rows
for col = 1:cols
for r = minr:maxr
a = row - r * cos(gradient(row, col));
b = col - r * sin(gradient(row, col));
a = round(a);
b = round(b);
if (a > 0 && a <= rows && b > 0 && b <= cols)
A(a, b, r) = A(a, b, r) + (magnitude(row, col)/r);
end
end
end
end
end
输出
尽管我使用的是 3 维数组,但下图是二维的,只是为了说明问题。
在 [a, b] 中累积之前执行的步骤 space
- 使用 3x3 高斯滤波器进行平滑处理。
- 使用 returns 幅度和方向图的 Sobel 算子进行边缘检测。
- 阈值化和细化。
来源
我正在使用 使用 Hough 变换的圆检测
Jaroslav Borovicka 的文档 提供指导。
我在您的代码中看到的一个问题是每个 r
只设置了一个点。你需要两个。请注意,渐变为您提供了边缘的方向,但您不知道朝向中心的方向——除非您正在计算带有实心圆盘的图像的渐变,并且您知道与背景的对比度(即它是总是白底黑字或黑底白字)。通常,一个点在距离 r
方向 theta
处设置一个点,另一个在方向 theta + pi
.
处设置一个点
您可能遇到的另一个问题是梯度计算不准确。如果你在二值化图像上计算它,梯度的方向将会偏离很多。在计算梯度之前对灰度图像进行加工可能会有所帮助(或者更好,使用 Gaussian gradients)。
"Smoothing using 3x3 Gaussian filter" 根据定义是错误的。参见上面的link。
"Thresholding and thinning" -- 尽量不要设置阈值。您的代码设置为使用梯度幅度作为权重进行累积。使用它们,它们会有所帮助。
最后,不要使用atan
,而是使用atan2
。
在[a,b]中进行累加的函数代码space
- minr:最小半径。
- maxr:最大半径。
- 量级:使用 Sobel 进行边缘检测后的二进制输出。
渐变:方向图。用 'atan(Ix./Iy)' 计算,其中 Ix 是水平的,Iy 是垂直的。
function [A] = accumulation(minr, maxr, magnitude, gradient) [rows, cols, ~] = size(magnitude); A = zeros(rows, cols, maxr); for row = 1:rows for col = 1:cols for r = minr:maxr a = row - r * cos(gradient(row, col)); b = col - r * sin(gradient(row, col)); a = round(a); b = round(b); if (a > 0 && a <= rows && b > 0 && b <= cols) A(a, b, r) = A(a, b, r) + (magnitude(row, col)/r); end end end end end
输出
尽管我使用的是 3 维数组,但下图是二维的,只是为了说明问题。
在 [a, b] 中累积之前执行的步骤 space
- 使用 3x3 高斯滤波器进行平滑处理。
- 使用 returns 幅度和方向图的 Sobel 算子进行边缘检测。
- 阈值化和细化。
来源 我正在使用 使用 Hough 变换的圆检测 Jaroslav Borovicka 的文档 提供指导。
我在您的代码中看到的一个问题是每个 r
只设置了一个点。你需要两个。请注意,渐变为您提供了边缘的方向,但您不知道朝向中心的方向——除非您正在计算带有实心圆盘的图像的渐变,并且您知道与背景的对比度(即它是总是白底黑字或黑底白字)。通常,一个点在距离 r
方向 theta
处设置一个点,另一个在方向 theta + pi
.
您可能遇到的另一个问题是梯度计算不准确。如果你在二值化图像上计算它,梯度的方向将会偏离很多。在计算梯度之前对灰度图像进行加工可能会有所帮助(或者更好,使用 Gaussian gradients)。
"Smoothing using 3x3 Gaussian filter" 根据定义是错误的。参见上面的link。
"Thresholding and thinning" -- 尽量不要设置阈值。您的代码设置为使用梯度幅度作为权重进行累积。使用它们,它们会有所帮助。
最后,不要使用atan
,而是使用atan2
。