Найдите прямые линии на изображенииPython

Программы на Python
Ответить
Anonymous
 Найдите прямые линии на изображении

Сообщение Anonymous »

Мне хотелось бы найти расположение некоторых строк в серии изображений. Пример изображения, где я вручную определил нужные строки, показан здесь:
[img]https://i.sstatic. net/HgSY8ROy.png[/img]

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

Код: Выделить всё

from skimage.transform import hough_line, hough_line_peaks
from skimage.filters import scharr
from skimage.color import rgb2lab
import matplotlib.image as mpimg

im = mpimg.read('image.png')

edges = scharr(rgb2lab(im[:,:,:])[:,:,0]) # Performing edge detection on the L-channel
angles = np.linspace(0.95*np.pi/2, 1.05*np.pi/2, 100) # Using a fairly narrow range of possible angles

h, theta, d = hough_line(edges, angles)
peaks = hough_line_peaks(h, theta, d, threshold=0.99*np.amax(h)) # Using a high threshold, default is 0.5*max(h)

plt.imshow(im)
for _, angle, dist in zip(*peaks):
(x0, y0) = dist * np.array([np.cos(angle), np.sin(angle)])
plt.axline((x0, y0), slope=np.tan(angle + np.pi / 2), lw=0.5, alpha=0.75, c='r')

Изображение

Много и много линий были (неправильно) идентифицированы, но не те, которые мне нужны.
Я также попробовал вероятностное преобразование Хафа:

Код: Выделить всё

from skimage.transform import probabilistic_hough_line

lines = probabilistic_hough_line(edges, threshold=10, line_length=5000, theta=angles)

plt.imshow(im)

for l in lines:
plt.plot([l[0][0], l[1][0]], [l[0][1], l[1][1]], c='r', alpha=0.75, lw=0.5)
Изображение

На этот раз похоже, что строки, которые мне нужны, действительно были идентифицированы, но более или менее, но также и множество других строк. Я пытался изменить параметр порога, но без видимого эффекта.
Я понимаю, что, возможно, мне не удастся автоматически найти именно те строки, которые мне нужны, так как есть и другие линии, это изображение , но то, что я нашел до сих пор, выглядит просто безумием. Мы будем очень признательны за любые предложения.
Изменить:
Я обнаружил, что если использовать небольшое размытие по Гауссу, и детектор края Канни вместо Шарра, кажется, работает намного лучше:

Код: Выделить всё

from skimage.feature import canny

l = rgb2lab(im[:,:,:])[:,:,0]
edges = canny(gaussian(l, 3), 1, 10, 20)
Изображение

Изображение
Обновление: Вот исходное изображение: Изображение

Подробнее здесь: https://stackoverflow.com/questions/793 ... s-in-image
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»