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)
在将图像提供给之前先对其进行预处理是一个好主意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)