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

Opencv: определение линии на изображении (доп. g коды по изображению)

10.11.2022, 11:56. Показов 1608. Ответов 6

Студворк — интернет-сервис помощи студентам
Добрый день

Не могу придумать как выделить среднюю линию на изображении как на примере ниже,
Название: cybforum.png
Просмотров: 42

Размер: 16.5 Кб
рисовал от руки с плохой мышкой, но надеюсь смог показать, что я имею ввиду.

Сейчас у меня есть вот такой код, который определяет контур линии и каким-то образом, не до конца разобрался, закрашивает его. Может быть та часть кода, которая закрашивает, может использоваться для отрисовки линии внутри?
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
import cv2
import numpy as np
 
img = cv2.imread('cybforum.png', cv2.IMREAD_COLOR)
 
# Convert the image to gray-scale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
# Find the edges in the image using canny detector
edges = cv2.Canny(gray, 50, 200, None, 3)
 
# Resize image to 256px*256px
img_256px = cv2.resize(edges, dsize=(256, 256))
cv2.imshow("Result Image", img_256px)
cv2.waitKey(0)
 
rho = 1  # distance resolution in pixels of the Hough grid
theta = np.pi / 180  # angular resolution in radians of the Hough grid
threshold = 10  # minimum number of votes (intersections in Hough grid cell)
min_line_length = 5  # minimum number of pixels making up a line
max_line_gap = 10  # maximum gap in pixels between connectable line segments
line_image = np.copy(img) * 0  # creating a blank to draw lines on
 
# Run Hough on edge detected image
# Output "lines" is an array containing endpoints of detected line segments
lines = cv2.HoughLinesP(edges, rho, theta, threshold, np.array([]),
                    min_line_length, max_line_gap)
 
for line in lines:
    for x1,y1,x2,y2 in line:
        cv2.line(line_image,(x1,y1),(x2,y2),(255,0,0),5)
 
# Resize image to 256px*256px
img_256px = cv2.resize(line_image, dsize=(256, 256))
cv2.imshow("Result Image", img_256px)
cv2.waitKey(0)
kek = 1
Вообще планирую получить из "жирной" линии линию шириной 1 пиксель. Всё это мне я надеюсь поможет потом каким-то образом получить данные, с которыми я смогу описать траекторию при помощи G-кодов. Если кто-то может подсказать и по этому вопросу, то буду ОЧЕНЬ благодарен, может это вообще всё стоит по другому делать, а я тут какую-то фигню придумываю :-)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.11.2022, 11:56
Ответы с готовыми решениями:

OpenCV, Определение личности по изображению
Добрый день! Хочу написать программу, которая смогла бы, на основе некоторого количества фотографий человека, определять его на фото и...

Определение попаданий мишени по изображению используя OpenCV и C++
Мне необходимо определить по изображению в какой сектор мишени попала пуля. Моя программа находит контуры с помощью библиотеки Opencv. ...

с++ Opencv 2.4 Определение лица на изображении
установил opencv2.4 http://www.samontab.com/web/2012/06/installing-opencv-2-4-1-ubuntu-12-04-lts/ Определение лица на изображении. ...

6
2 / 2 / 0
Регистрация: 23.12.2021
Сообщений: 39
10.11.2022, 12:46  [ТС]
Поискал решения обходя OpenCV и нашел вот такое, меня оно вроде как устраивает. Но если кто-нибудь подскажет насчет разбора данной траектории на g коды, буду весьма весьма признателен)


Новый код:
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
from matplotlib import pyplot as plt
from skimage.morphology import medial_axis
import cv2
 
# Determine contour
img_file = 'very_hard_14px.png'
img = cv2.imread(img_file, cv2.IMREAD_COLOR)
 
# Convert the image to gray-scale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.bitwise_not(gray)
 
# Compute the medial axis (skeleton) and the distance transform
skel, distance = medial_axis(gray, return_distance=True)
 
# Distance to the background for pixels of the skeleton
dist_on_skel = distance * skel
 
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))
ax1.imshow(gray, cmap=plt.cm.gray, interpolation='nearest')
ax1.axis('off')
ax2.imshow(dist_on_skel, interpolation='nearest')
ax2.contour(gray, [0.5], colors='w')
ax2.axis('off')
 
fig.subplots_adjust(hspace=0.01, wspace=0.01, top=1, bottom=0, left=0, right=1)
plt.show()
0
2742 / 1668 / 269
Регистрация: 19.02.2010
Сообщений: 4,413
10.11.2022, 14:49
Цитата Сообщение от Kovgan Посмотреть сообщение
Вообще планирую получить из "жирной" линии линию шириной 1 пиксель.
Это делается морфологической операцией Erosion. Может быть, неоднократно применённой (если линия сильно толстая).
Читай доку про cv2::erode()
1
2 / 2 / 0
Регистрация: 23.12.2021
Сообщений: 39
10.11.2022, 15:05  [ТС]
VTsaregorodtsev,

У меня чет её так размыло, будто краску разлил на листе. У меня конечно как я сказал успешно получилось найти линию при помощи medial_axis из scikit-image, но всё равно интересно. Предполагается размывать и убирать после этого пиксели, которые изменили цвет? Или как это должно работать? Просто я уже пытался использовать размытие по Гауссу для такого способа, выходило так, что пропадали промежуточные звенья линии

Python
1
2
3
kernel = np.ones((5, 5), 'uint8')
check = cv2.erode(img, kernel, iterations=10)
cv2.imshow('image', check)
0
2 / 2 / 0
Регистрация: 23.12.2021
Сообщений: 39
10.11.2022, 15:13  [ТС]
Вот так у меня получается
0
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,760
10.11.2022, 20:42
Лучший ответ Сообщение было отмечено Kovgan как решение

Решение

Kovgan, правильно, у вас картинка инверсная, т.к. объект черный, а фон белый. В этом случае используйте дилатацию.
Но, правильнее, такая операция называется нахождением остова или скелетонизацией.
Можно делать и в OpenCV через дилатацию и логические операции в цикле, но в scikit-image такая операция работает из коробки.
Python
1
2
3
4
5
6
7
from skimage.morphology import skeletonize
import cv2
img = cv2.imread('cybforum.png', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_,bw=cv2.threshold(gray,  127,1, cv2.THRESH_BINARY_INV)
skel=~skeletonize(bw)
cv2.imwrite( 'skel.png', 255*skel)
Изображения
 
1
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,760
10.11.2022, 21:00
Лучший ответ Сообщение было отмечено Kovgan как решение

Решение

вместо skeletinize можно использовать функцию thin.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.11.2022, 21:00
Помогаю со студенческими работами здесь

Определение положения объекта на изображении OpenCV
Есть определённое изображение на котором нужно найти конец прямой и понять между какими контурами окружности этот конец находиться....

Opencv. Применение дискретной теоремы Грина к изображению
Пытаюсь реализовать алгоритм поиска ядра отпечатка пальца по этой статье. По формуле \begin{bmatrix}J_x(x,y)\\...

Построение диаграммы по бинарному изображению Winform c++, opencv
Доброго времени суток! Подскажите простой способ построения диаграммы по бинарному изображению формата iplimage, пишу в студии 13,...

Отрисовывать линии по изображению
Есть изображение, фон белый, на нем черные нарисованные линии. Задача стоит следующая, необходимо поменять цвет этих линий и выдать...

Поиск изображения на изображении OpenCV ?
Требуется искать изображение на экране смартфона и кликать по нему. Для автокликера. Изображение ищется с указанной точностью совпадения....


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
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 существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
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/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru