我正在实现一个程序来检测摄像机图像中的线条。问题是,当照片模糊时,我的行检测算法会丢失几行。是否可以在不编辑参数的情况下提高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)
答案 0 :(得分:8)
最好先对图像进行预处理,然后再将其提供给cv2.HoughLines()
。我也认为cv2.HoughLinesP()
会更好。这是一种简单的方法
我们使用cv2.filter2D()
应用锐化内核,该锐化内核为我们提供了线条的一般形状,并删除了模糊的部分。可以找到其他过滤器here。
现在我们将图像阈值设置为实线
缺陷很小,因此我们可以将morphological operations与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()
答案 1 :(得分:4)
您正在寻找图像锐化技术。您会找到建议here。 您可以使用不同的内核操作来实现。 OpenCV列出了此C ++代码here
// sharpen image using "unsharp mask" algorithm
Mat blurred; double sigma = 1, threshold = 5, amount = 1;
GaussianBlur(img, blurred, Size(), sigma, sigma);
Mat lowContrastMask = abs(img - blurred) < threshold;
Mat sharpened = img*(1+amount) + blurred*(-amount);
img.copyTo(sharpened, lowContrastMask);
应该很容易转换为Python。