2 / 2 / 0
Регистрация: 23.12.2021
Сообщений: 39

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

18.12.2022, 19:25. Показов 490. Ответов 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
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,760
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка 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 существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru