问题: 我想在 Python 中使用 OpenCV 检测给定图像中的线条。尽管有多条明显的垂直线,但无论是普通 HoughLines 还是概率 HoughLines 都找不到它们。由于我花了很多时间玩参数,我想我在这里做一些根本性的错误。我知道这样一个事实,即 hough-lines 通常应用于边缘,例如在使用 canny 之后。由于 canny 的非最大抑制,canny 在这里没有给出好的结果。
图像,检测垂直线失败:
为什么: 鉴于此(水表的图像):
我想检测每个数字周围的矩形。为了检测矩形,我在 x 和 y 方向上使用了 sobel 滤波器,并计算了梯度的幅度和角度/相位。由于我假设图像在此步骤中正确旋转,因此我提取了垂直和水平边缘,如图所示。我希望利用 houghLines 找到边界框。找到水平线效果很好,如图所示
包含对问题的进一步见解的调试图,因为我不处理垂直组件(第二行):
检测每个数字周围的矩形将帮助我
- 定位感兴趣的区域
- 切出矩形内的区域,也就是数字。其他几种使用轮廓直接检测数字的方法都存在外部矩形干扰数字的问题。
更新:检测垂直线的代码:
#img is initialized with the binarized, vertical component image, as shown above
minLength = 30
maxGap = 7
angle_res = np.pi / 180
rad_res = 2
threshold_val = 100
linesP = cv2.HoughLinesP(img, rad_res, angle_res, threshold_val, minLineLength=minLength, maxLineGap=maxGap)
cdst = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cdstP = np.copy(cdst)
if linesP is None:
print("Error when finding lines (probabilistic hough transformation). No lines detected")
else:
# Copy edges to the images that will display the results in BGR
for i in range(0, len(linesP)):
l = linesP[i][0]
cv2.line(cdstP, (l[0], l[1]), (l[2], l[3]), (255,0,0), 3, cv2.LINE_AA)
plt.imshow(cdstP); plt.show()