Python OpenCV : Hough Transform does not detect obvious lines

标签 python opencv hough-transform houghlines

问题: 我想在 Python 中使用 OpenCV 检测给定图像中的线条。虽然有多条明显的垂直线,但普通 HoughLines 和概率 HoughLines 都没有找到它们。由于我花了很多时间研究参数,所以我想我在这里做的根本性错误。我知道这样一个事实,即霍夫线通常应用于边缘,例如使用精明后。由于canny的非最大抑制,canny在这里没有给出好的结果。

图像,检测垂直线失败:

enter image description here

原因: 鉴于此(水表图像):

enter image description here

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

所示

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

enter image description here

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

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

最佳答案

首先应用具有适当阈值设置的 canny edge。然后应用概率霍夫线变换。应用霍夫变换后,用斜率过滤线。你想过滤框,所以你需要过滤水平和垂直线。过滤线后,将形态学膨胀和腐 eclipse 操作背靠背应用于结果图像,以获得每个数字周围的整齐框。在应用霍夫变换时,适本地选择参数最小线长、最大线长和最大线间隙。 您可以在选择适当的参数时使用轨迹栏功能。下面给出了canny edge阈值选择的示例代码。

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

希望对你有帮助。

关于Python OpenCV : Hough Transform does not detect obvious lines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56304982/

相关文章:

Python Mechanize 带有下拉提交的复选框

java - Android opencv加载16位深度的灰度png

python - 霍夫线检测到太多线

python - 霍夫变换未检测到正确的圆

python - 计算图像中对象的中心

python - 在 Canvas 中移动鼠标并显示以相同方式移动的点,但在另一个 Canvas 中

python - Django Localhost CORS 不工作

python - 将窗口的内容获取到文本文件

matlab - 如何更改二维图像的视口(viewport)?

python - opencv 3.0 python imshow错误