1

问题: 我想在 Python 中使用 OpenCV 检测给定图像中的线条。尽管有多条明显的垂直线,但无论是普通 HoughLines 还是概率 HoughLines 都找不到它们。由于我花了很多时间玩参数,我想我在这里做一些根本性的错误。我知道这样一个事实,即 hough-lines 通常应用于边缘,例如在使用 canny 之后。由于 canny 的非最大抑制,canny 在这里没有给出好的结果。

图像,检测垂直线失败:

在此处输入图像描述

为什么: 鉴于此(水表的图像):

在此处输入图像描述

我想检测每个数字周围的矩形。为了检测矩形,我在 x 和 y 方向上使用了 sobel 滤波器,并计算了梯度的幅度和角度/相位。由于我假设图像在此步骤中正确旋转,因此我提取了垂直和水平边缘,如图所示。我希望利用 houghLines 找到边界框。找到水平线效果很好,如图所示

包含对问题的进一步见解的调试图,因为我不处理垂直组件(第二行):

在此处输入图像描述

检测每个数字周围的矩形将帮助我

  1. 定位感兴趣的区域
  2. 切出矩形内的区域,也就是数字。其他几种使用轮廓直接检测数字的方法都存在外部矩形干扰数字的问题。

更新:检测垂直线的代码:

#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()
4

1 回答 1

1

首先应用 canny edge 并设置适当的阈值。然后应用概率霍夫线变换。应用霍夫变换后,对具有斜率的线进行过滤。您想要过滤该框,因此您需要过滤水平线和垂直线。过滤线后对结果图像应用形态膨胀和腐蚀操作,以获得每个数字周围的整齐框。在应用霍夫变换时,选择参数最小线长度,最大线长度和最大线路差距适当。您可以在选择适当的参数时使用轨迹栏功能。下面给出了示例代码,用于选择 Canny 边缘的阈值。

import cv2
import numpy as np

cv2.namedWindow('Result')
img = cv2.imread('qkEuE.png')

v1 = 0
v2 = 0

def doEdges():
    edges = cv2.Canny(img,v1,v2)
    edges = cv2.cvtColor(edges,cv2.COLOR_GRAY2BGR)
    res = np.concatenate((img,edges),axis = 0)
    cv2.imshow('Result',res)
def setVal1(val):
    global v1
    v1 = val
    doEdges()
def setVal2(val):
    global v2
    v2 = val
    doEdges()

cv2.createTrackbar('Val1','Result',0,500,setVal1)
cv2.createTrackbar('Val2','Result',0,500,setVal2)

cv2.imshow('Result',img)
cv2.waitKey(0)
cv2.destroyAllWindows

希望它可以帮助你。

于 2019-05-25T19:37:48.693 回答