объяснение кода о hough_line и hough_line_peaks

Мне удалось найти эту ссылку: Расчет угол между двумя линиями на изображении в Python, из которого я взял только часть кода, позволяющую вычислить угол:

import numpy as np
from skimage.transform import (hough_line, hough_line_peaks, probabilistic_hough_line)
from pylab import imread, gray, mean
import matplotlib.pyplot as plt

image = imread('D:\\Pictures\\PyTestPics\\oo.tiff')
image = np.mean(image, axis=2)

h, theta, d = hough_line(image)

angle = []
dist = []
for _, a, d in zip(*hough_line_peaks(h, theta, d)):
    angle.append(a)
    dist.append(d)

angle = [a*180/np.pi for a in angle]
angle_reel = np.max(angle) - np.min(angle)

print(angle_reel)

кто-нибудь может объяснить мне код цикла for и angular_reel? потому что я не мог понять, как существуют множественные углы и эти множественные углы образуются между какой линией и каким другим объектом внутри изображения? Это было бы очень признательно.


person Community    schedule 22.04.2019    source источник


Ответы (1)


Ваше изображение состоит из двух строк, я назову их строка a и строка b. Каждая из этих линий будет иметь и угол. Угол между этими линиями будет angle of line a - angle of line b.

Когда ваш код перебирает hough_line_peaks в , он фактически перебирает данные для каждой строки. Каждая линия имеет расстояние и угол.

for _, a, d in zip(*hough_line_peaks(h, theta, d)):
    angle.append(a)
    dist.append(d)

Если на вашем изображении две линии, вы получите список углов с двумя значениями. Эти два значения будут углами линий относительно края изображения. Чтобы найти угол линий по отношению друг к другу, вычтите значения.

Вот пример изображения:

изображение с двумя линиями

Углы линий: [1.3075343725834614, 0.48264691605429766]. Это в радианах, поэтому они конвертируются в градусы с помощью кода: angle = [a*180/np.pi for a in angle]. В градусах углы равны [74.91620111731844, 27.65363128491619]. Это кажется довольно разумным, один чуть больше 45 градусов, а другой чуть меньше. Угол между линиями равен max(angles) - min(angles) или 47,262 градуса.

На этом изображении показаны углы, нарисованные на изображении:

углы на изображении

person Stephen Meschke    schedule 22.04.2019
comment
так что просто чтобы убедиться, что я правильно понял, для каждой линии есть угол, и этот угол формируется между осью x и линией, соединяющей начало координат с ближайшей точкой, которую я затем конвертирую из радиан в градусы и когда я вычитаю мин. угол от максимального угла я получаю тот же угол между двумя линиями? - person ; 22.04.2019
comment
@Daniel_Kamel Думаю, вы меня правильно поняли. Я добавил еще одно изображение внизу ответа. Новое изображение включает углы. Это должно устранить любую путаницу. - person Stephen Meschke; 22.04.2019
comment
большое спасибо, я очень ценю это, вы заслуживаете моего одобрения. - person ; 22.04.2019
comment
Спасибо! @Даниэль_Камел. Если это отвечает на ваш вопрос, пожалуйста, примите мой ответ, нажав на галочку. - person Stephen Meschke; 22.04.2019