1

在下图中,您可以看到我能够很好地识别水平线,但垂直线并没有那么好。特别是,没有看到网格的中间线,而侧线被透支(即相互连接)。

这是创建它的代码:

img = cv2.imread('./p6.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
threshhold, threshhold_img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
edges = cv2.Canny(threshhold_img, 150, 200, 3, 5)
lines = cv2.HoughLinesP(edges,1,np.pi/180,500, minLineLength = 600, maxLineGap = 75)[0].tolist()

for x1,y1,x2,y2 in lines:
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),1)

当我调整了不同的参数时,我最终会遇到这样一种情况,即最中间的垂直线(JEXXY在表格中刚刚结束的那一条)从底部延伸到第三个网格的顶部。除非我将参数放宽到几乎每条线都被绘制出来,包括前三个网格顶部的代表yi, er,的线,否则我san无法获取代码来查看定义网格内部的中间垂直线。

我怎样才能解决这个问题?

画有霍夫线的图像

* 更新为使用 THRESH_BINARY_INV 而无需精明 *

img = cv2.imread('./p6.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
threshhold, threshhold_img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV)
lines = cv2.HoughLinesP(edges,1,np.pi/180,500, minLineLength = 600, maxLineGap = 75)[0].tolist()

for x1,y1,x2,y2 in lines:
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),1)

使用 THRESH_BINARY_INV 的 threshold_img 的中间图片

执行 THRESH_BINARY_INV 后,这是行输出

* 更新:使用 BINARY 和 OTSU 添加阈值 img *

threshold_img 与 THRESH_BINARY + THRESH_OTSU

4

1 回答 1

3

我认为在您的情况下发生的情况是,很难找到一组同时创建水平线和垂直线的参数,而不会有一些线从其他线“窃取”选票。你可以在这里做一个快速的技巧,只强制检测垂直线,而稍后关注你的主要水平线:

# Vertical lines
lines = cv2.HoughLinesP(
    threshhold_img, 1, np.pi, threshold=100, minLineLength=100, maxLineGap=1)

# Horizontal lines
lines2 = cv2.HoughLinesP(
    threshhold_img, 1, np.pi / 2, threshold=500, minLineLength=500, maxLineGap=1)

这给了我:

在此处输入图像描述

于 2015-06-14T20:08:32.053 回答