Hough Lines обнаруживает слишком много строк - PullRequest
1 голос
/ 27 апреля 2020

Я пытаюсь извлечь вертикальные линии из изображения fabri c, используя грубые линии в opencv. Я применил контрастное усиление, чтобы улучшить линии и двустороннюю фильтрацию, чтобы попытаться удалить другие текстуры fabri c. Тем не менее, при применении резких линий, код обнаруживает линии по всему изображению. Я попытался поиграться с параметрами для hough, но результаты были такими же.

Входное изображение после применения выравнивания гистограммы и двустороннего фильтра:

enter image description here

Вот изображение после применения грубой линии, красным цветом обозначены обнаруженные линии. Выходные данные, показывающие обнаружение резких скачков:

enter image description here

Другой способ, который я могу попробовать, чтобы скачка не начинала обнаруживать мелкие фигуры Фабри c в виде линий а?

Вот код, который у меня есть:

`

    img1= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    img2 = cv2.equalizeHist(img1)
    img3 = cv2.equalizeHist(img2)
    img4 = cv2.equalizeHist(img3)
    img5 = cv2.bilateralFilter(img4, 9, 75,75)
    cv2.imshow("threshold",img5)
    edges = cv2.Canny(img4,50,127,apertureSize = 3)
    lines= cv2.HoughLines(edges, 1, math.pi/180.0, 200, np.array([]), 0, 0)
    a,b,c = lines.shape
    for i in range(a):
        rho = lines[i][0][0]
        theta = lines[i][0][1]
        a = math.cos(theta)
        b = math.sin(theta)
        x0, y0 = a*rho, b*rho
        pt1 = ( int(x0+1000*(-b)), int(y0+1000*(a)) )
        pt2 = ( int(x0-1000*(-b)), int(y0-1000*(a)) )
        cv2.line(img, pt1, pt2, (0, 0, 255), 2, cv2.LINE_AA)

cv2.imshow('image1',img)
cv2.waitKey(0)
cv2.destroyAllWindows()`

1 Ответ

2 голосов
/ 28 апреля 2020

Вам необходимо пороговое значение для вашего выровненного изображения, применить морфологию, чтобы очистить его, прежде чем выполнять обнаружение неровных краев и извлечение неровных линий. Использование Python / OpenCV для выполнения следующей обработки.

Ввод:

enter image description here

import cv2
import numpy as np
import math

# read image
img = cv2.imread('fabric_equalized.png')

# convert to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# threshold
thresh = cv2.threshold(gray,165,255,cv2.THRESH_BINARY)[1]

# apply close to connect the white areas
kernel = np.ones((15,1), np.uint8)
morph = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
kernel = np.ones((17,3), np.uint8)
morph = cv2.morphologyEx(morph, cv2.MORPH_CLOSE, kernel)

# apply canny edge detection
edges = cv2.Canny(img, 175, 200)

# get hough lines
result = img.copy()
lines= cv2.HoughLines(edges, 1, math.pi/180.0, 165, np.array([]), 0, 0)
a,b,c = lines.shape
for i in range(a):
    rho = lines[i][0][0]
    theta = lines[i][0][1]
    a = math.cos(theta)
    b = math.sin(theta)
    x0, y0 = a*rho, b*rho
    pt1 = ( int(x0+1000*(-b)), int(y0+1000*(a)) )
    pt2 = ( int(x0-1000*(-b)), int(y0-1000*(a)) )
    cv2.line(result, pt1, pt2, (0, 0, 255), 2, cv2.LINE_AA)


# save resulting images
cv2.imwrite('fabric_equalized_thresh.jpg',thresh)
cv2.imwrite('fabric_equalized_morph.jpg',morph)
cv2.imwrite('fabric_equalized_edges.jpg',edges)
cv2.imwrite('fabric_equalized_lines.jpg',result)

# show thresh and result    
cv2.imshow("thresh", thresh)
cv2.imshow("morph", morph)
cv2.imshow("edges", edges)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()


Предел изображения:

enter image description here

Морфологически очищенное изображение:

enter image description here

Край изображения:

enter image description here

Результирующие линии Хафа:

enter image description here

...