OpenCV中图像大小对边缘检测的影响

信息处理 opencv 霍夫变换 精明边缘检测器
2022-02-21 10:00:39

我需要在 OpenCV 中扫描图像并获取线条。为此,我使用精明边缘检测器,然后使用概率霍夫变换,我实际上得到了线条。
现在的问题是我得到了许多短线而不是一些连续的线。我正在分析的图像大小为 1024x768,我想知道这是否可能是错误源。从理论上讲,使图像更小应该会导致更少的线条。这对我的任务有帮助吗?还是在提取线条时我应该考虑其他任何因素?

1个回答

在更改图像大小之前,您应该使用Canny()和函数的许多参数。HoughLinesP()

的原型Canny()是:

void Canny(InputArray image, OutputArray edges,
           double threshold1, double threshold2,
           int apertureSize=3, bool L2gradient=false )

您应该使用threshold1和参数threshold2直到您得到一个输出,该输出准确地标记了图像中线条中涉及的像素。参数控制强度,在该强度之上,梯度值将被确定为边缘的一部分。将它设置得更高会给你更少的边缘。参数控制强度,高于该强度的像素将被视为从相邻像素延续边缘。将它设置得更低会给你更长的边缘。比率/应至少为 2.0,可以大到 3.0,甚至可能更大。设置将使算法稍微慢一些,但会使用一阶导数的更准确的梯度计算。环境aperturSizeL2gradientCanny()threshold2threshold1threshold2threshold1L2gradienttrueapertureSize到 5 或 7 可能会在一阶导数计算中消除一些噪声。

只有在您Canny()准确地找到图像中的边缘后,您才能继续运行HoughLinesP()HoughLinesP()还有一堆旋钮,你需要调整以获得不错的结果。

void HoughLinesP(InputArray image, OutputArray lines,
                 double rho, double theta,
                 int threshold,
                 double minLineLength=0,
                 double maxLineGap=0 )

rho并且theta可以根据您想要允许的长度和角度设置得更大或更小。设置rhotheta更大会给你更少的线段,但它们会不太准确。 threshold可以增加以减少您获得的线段数。 minLineLength可以增加以拒绝短线段,并且maxLineGap可以增加以使短线更容易连接在一起。

设置较大Canny()apertureSize参数有点像处理较小的图像,因为较大的光圈会对图像的细节进行更多的模糊/平滑。HoughLinesP()'srhotheta参数设置得更大有点像处理较小的图像,因为您将角度或长度的微小差异集中在一起,这些差异在较小的图像中是无法区分的。

OpenCV 文档HoughLinesP()一个示例:

Canny( src, dst, 50, 200, 3 );
...
HoughLinesP( dst, lines, 1, CV_PI/180, 80, 30, 10 );