Вероятностные линии Хафа, возвращающие только угловые линии

#python #opencv #machine-learning #computer-vision

#python #opencv #машинное обучение #компьютерное зрение

Вопрос:

Я пытаюсь проанализировать планы этажей, чтобы превратить их в массив линейных координат, используя HoughLinesP в opencv-python, и функция возвращает только строки, которые расположены под углом и не имеют никакого отношения к фактическим строкам на моем изображении.

Вот мой код:

 import cv2

# Read image and convert to grayscale
img = cv2.imread('C:/Data/images/floorplan/extremely basic.png', -1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Get lines with probabilistic hough lines
found_lines = cv2.HoughLinesP(gray, 1, 3.14 / 160, 100,
                              minLineLength=1, maxLineGap=10)

# Loop through found lines and draw each line on original image
for line in found_lines:
    x1, y1, x2, y2 = line[0]
    cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 1)

# Show image, wait until keypress, close windows.
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
 

И вот что будет возвращено с пороговыми значениями 150 и 100 соответственно:

введите описание изображения здесь

введите описание изображения здесь

Оригинал

Я пробовал переделывать все параметры и безуспешно пытался использовать не вероятностные линии Хафа.

Комментарии:

1. каков размер вашего входного изображения? это очень мало?

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

3. Я думаю, проблема в maxLineGap= 10. пикселей между этими строками больше 10 попробуйте 40 или 50

4. Можете ли вы поделиться исходным изображением, чтобы мы тоже могли попробовать? Такого рода проблемы обычно возникают из-за параметров, которые вы присваиваете этой функции

5. Я добавил исходное изображение в OP

Ответ №1:

Проблема была с инверсией изображения и параметрами. Вам необходимо выполнить дополнительные настройки, поскольку это не дает всех строк.

Код тестируется в Google colab. Удалить from google.colab.patches import cv2_imshow и заменить cv_imshow на cv2.imshow для локального использования.

Частичный вывод изображения

введите описание изображения здесь

Код

 import cv2
import numpy as np
from google.colab.patches import cv2_imshow

# Read image and convert to grayscale
img = cv2.imread('1.jpg', 0)
#gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


s1, s2 = img.shape
new_img = np.zeros([s1,s2],dtype=np.uint8)
new_img.fill(255)


ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
cv2_imshow(thresh1)


kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(thresh1,kernel,iterations = 1)
cv2_imshow(erosion)


# Get lines with probabilistic hough lines
found_lines = cv2.HoughLinesP(erosion, np.pi/180, np.pi/180, 10, minLineLength=4, maxLineGap=4)

# Loop through found lines and draw each line on original image
for line in found_lines:
    x1, y1, x2, y2 = line[0]
    cv2.line(new_img, (x1, y1), (x2, y2), (0, 0, 255), 1)
    cv2_imshow(new_img)
    #cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 1)

# Show image, wait until keypress, close windows.
print("ORIGINAL IMAGE:")
cv2_imshow(img)
#cv2.imshow('image', img)
#cv2.waitKey(0)
#cv2.destroyAllWindows()