使用OpenCV提高检测线的准确性

Jos*_*key 5 python opencv image image-processing computer-vision

我正在实现一个程序来检测摄像机图像中的线条。问题是,当照片模糊时,我的行检测算法会丢失几行。有没有一种方法可以在cv.HoughLines()不编辑参数的情况下提高功能的准确性?

输入图像示例:

模糊。

所需图片:

在此处输入图片说明

我当前的实现:

def find_lines(img):
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    edges = cv.dilate(gray,np.ones((3,3), np.uint8),iterations=5)
    edges = cv.Canny(gray, 50, 150, apertureSize=3)
    lines = cv.HoughLines(edges, 1, np.pi/180, 350)
Run Code Online (Sandbox Code Playgroud)

nat*_*ncy 7

在将图像提供给之前先对其进行预处理是一个好主意cv2.HoughLines()。我也认为cv2.HoughLinesP()会更好。这是一个简单的方法

  • 将图像转换为灰度
  • 应用锐化内核
  • 阈值图像
  • 执行形态学操作以平滑/过滤图像

我们应用锐化内核cv2.filter2D(),该锐化内核可以使线条具有大致的形状,并去除模糊的部分。其他过滤器可以在这里找到。

在此处输入图片说明

现在我们对图像进行阈值处理以获得实线

在此处输入图片说明

瑕疵很小,因此我们可以对内核使用形态学运算cv2.MORPH_ELLIPSE来获得干净的菱形

在此处输入图片说明

最后,为了获得所需的结果,我们使用相同的内核进行扩展。根据迭代次数,我们可以获得更细或更宽的线

左(iterations=2),右(iterations=3

在此处输入图片说明 在此处输入图片说明

import cv2
import numpy as np

image = cv2.imread('1.png', 0)
sharpen_kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
sharpen = cv2.filter2D(image, -1, sharpen_kernel)
thresh = cv2.threshold(sharpen,220, 255,cv2.THRESH_BINARY)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=3)
result = cv2.dilate(opening, kernel, iterations=3)

cv2.imshow('thresh', thresh)
cv2.imshow('sharpen', sharpen)
cv2.imshow('opening', opening)
cv2.imshow('result', result)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)