使用OpenCV

时间:2019-07-17 17:01:47

标签: python image opencv image-processing computer-vision

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

示例输入图像:

Blurry.

所需图像:

enter image description here

我当前的实现方式:

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)

2 个答案:

答案 0 :(得分:8)

最好先对图像进行预处理,然后再将其提供给cv2.HoughLines()。我也认为cv2.HoughLinesP()会更好。这是一种简单的方法

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

我们使用cv2.filter2D()应用锐化内核,该锐化内核为我们提供了线条的一般形状,并删除了模糊的部分。可以找到其他过滤器here

enter image description here

现在我们将图像阈值设置为实线

enter image description here

缺陷很小,因此我们可以将morphological operationscv2.MORPH_ELLIPSE内核一起使用以获得干净的菱形

enter image description here

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

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

enter image description here enter image description here

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。