Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 0
Регистрация: 23.12.2021
Сообщений: 39

Проблема со скелетизацией линии

18.12.2022, 19:25. Показов 494. Ответов 2

Студворк — интернет-сервис помощи студентам
Добрый день. Друзья, у меня следующая проблема.

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

Имеется следующий код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import os
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
 
from tkinter import Tk
from skimage.morphology import skeletonize
from tkinter.filedialog import askopenfilename
 
 
def choose_img_ui(): # выбрать файл используя gui
    Tk().withdraw()
    filename = askopenfilename(initialdir= os.getcwd(),
                                title="Выберете файл:")
    print(filename)
    return filename
 
 
def import_img(path): # считать изображения по пути
    im = cv.imread(path)
    return im   
 
 
def thresh_im(im): # получить чёрно-белое изображение + простой порог
    imgray = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
    blurred = cv.GaussianBlur(imgray, (3, 3), 0)
    ret, thresh = cv.threshold(imgray, 200, 255, 0)
    return thresh
 
 
def medline(im): # получить центральную линию фигуры (1 пиксель)
    iminvert = cv.bitwise_not(im)
    iminvert[iminvert == 255] = 1
    med_axis = skeletonize(iminvert)
    med_axis = med_axis + 0
    med_axis[med_axis == 0] = 255
    med_axis[med_axis == 1] = 0
    return med_axis
 
 
if __name__ == '__main__':
    path = choose_img_ui()
    im = import_img(path)
    thresh = thresh_im(im)
    med_axis = medline(thresh)
 
    fig, axes = plt.subplots(1, 3, figsize=(16, 16), sharex=True, sharey=True)
    ax = axes.ravel()
 
    ax[0].imshow(im)
    ax[0].set_title('Original')
    ax[0].axis('off')
 
    ax[1].imshow(thresh)
    ax[1].set_title('Black-n-White')
    ax[1].axis('off')
 
    ax[2].imshow(med_axis, cmap='magma')
    ax[2].contour(thresh, [0.5], colors='b')
    ax[2].set_title('Medial axis')
    ax[2].axis('off')
 
    fig.tight_layout()
    plt.show()
Используя данное изображение:

На выходе получаем следующее:

Но имеется проблема, которая не дает мне возможность отсортировать пиксели по порядку:

На тупых углах проблема не наблюдается, только на острых, потому что образуется большое скопление пикселей и не понятно, где какая прямая идет.
Помогите, пожалуйста, мне требуется или каким-то образом отрезать эту часть, что не является желаемым результатом, но терпимым. Или же сделать, что-то типа того (сам дорисовал в paint),

но понятия не имею как достичь такого результата.

Пробовал уже использовать cv2.erode, размывать изображение и отсекать не полностью черные пиксели, а серые. Но всё безуспешно
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.12.2022, 19:25
Ответы с готовыми решениями:

Проблема рисования толстой пунктирной линии
Всем привет! столкнулся с такой проблемой что не получается нарисовать толстую пунктирную линию. Когда устанавливаю толщину линии...

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

Photoshop Проблема с местом появления линии и нахождением пера
Parblo a610 Настроил фш, чтобы он реагировал на перо, реагировать начал, но стал рисовать в другом месте, отличном от положения пера на...

2
5517 / 2870 / 571
Регистрация: 07.11.2019
Сообщений: 4,761
18.12.2022, 21:22
Лучший ответ Сообщение было отмечено Kovgan как решение

Решение

Цитата Сообщение от Kovgan Посмотреть сообщение
но понятия не имею как достичь такого результата
Никак не достигните, используя скелетонизацию. Есть вариант удалить короткие отростки. Это можно сделать как-то так:
1. Размыть скелет и сделать бинаризацию по порогу. (порог подобрать, так, чтобы толька на перекрестках получились точки)
2. Логическими операциями (И, ИЛИ, НЕ, в зависимости от негатива или позитива) скелета и картинки с п.1 добиться разделения изображения на сегменты.
3. cv.connectedComponentsWithStats пометить сегменты и удалить слишком мелкие по площади (или есть функция scikit-image для удаления мелких элементов)
В итоге, должна получится картинка скелета, но без развилок в углах.
Еще можно попробовать предобработку картинки ломаной линии, перед скелетонизацией, операциями типа открытие/закрытие с круглым ядром.
1
2 / 2 / 0
Регистрация: 23.12.2021
Сообщений: 39
18.12.2022, 22:24  [ТС]
Спасибо, думал в этом направлении как раз, но теперь хотя бы понимаю, что по-любому придется избавляться от таких торчащих кусочков)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.12.2022, 22:24
Помогаю со студенческими работами здесь

Несколько DS18B20 на одной линии. Проблема общения с ними.
День добрый. Подключил три датчика ds18b20 на одну линию (STM32F746). Предварительно подключая каждый по отдельности выудил их адреса....

Проблема с adobe after effects. Не могу сделать светящиеся линии по кадрам
Хочу сделать светящиеся линии по кадрам, я выбрал цвет синий, выбрал длительность 1 кадр, но почему-то цвет кисти черный и сама линия...

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

Рисование линии мышью на BufferedImage и отрисовка нарисованной линии в JPanel
Здравствуйте. Вопрос: как рисовать линию мышью на BufferedImage (или Image), а потом всё нарисованное на BufferedImage отрисовать на...

Форма делится на сектора. Курсором мыши можно рисовать линии. Цвет линии зависит
Народ спасайте. Задача такова " Форма делится на сектора (их количество задает пользователь). Курсором мыши можно рисовать линии. Цвет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru