#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()