Содержание
Техника изготовления картин из ниток (String Art) на OpenCV – RoboCraft
На региональном новостном сайте увидел новость: «Янтарному подарили портрет Канта из 5 километров ниток» и заинтересовался — как же подобные картины делаются.
Оказалось, что подобная техника называется String Art и сразу же нашлись самые разные варианты изготовления подобных картин.
Как вручную:
, так и автоматически — при помощи самых разных станков:
youtube.com/embed/RSRNZaq30W0?feature=oembed» frameborder=»0″ allow=»accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture» allowfullscreen=»»>
Осталось разобраться — как же это делается программно.
По счастливому стечению обстоятельств на глаза попалась статья: Круглые картины из натянутых ниток. Разоблачение, которая и подсказала, что в основе лежит простой алгоритм, состоящий из следующих основных этапов:
1. предварительная обработка изображения: изображение переводится в градации серого, обрезается в квадрат, вписывается в круг и инвертируется в негатив.
2. процедура определения, где нужно провести линию: алгоритм в цикле перебирает все варианты проведения линии от одной точки ко всем остальны точкам, чтобы найти такой вариант, который даёт наиболее подходящее затенение.
3. генерация кодов управления станком ЧПУ: зная какие линии нужно провести для данного изображения — генерируются соответствующие команды для станка, который будет выполнять автоматическое натягивания нити по заданным координатам.
К сожалению, код который приводится в статье сразу не заработал, зато на гитхабе быстро нашёлся готовый вариант на Python и OpenCV: string-art/alog2. py
Всё реализовано довольно просто:
import cv2 import numpy as np imgPath = './cat4.jpg' # My Cheshire Cat # Parameters imgRadius = 200 # Number of pixels that the image radius is resized to initPin = 0 # Initial pin to start threading from numPins = 200 # Number of pins on the circular loom numLines = 500 # Maximal number of lines minLoop = 3 # Disallow loops of less than minLoop lines lineWidth = 3 # The number of pixels that represents the width of a thread lineWeight = 15 # The weight a single thread has in terms of "darkness"
— подключаются нужные библиотеки и задаются соответствующие параметры, включая имя изображения, подлежащего преобразованию:
Задаются вспомогательные функции, которые реализуют предварительную обработку изображения — обрезки до круга и инвертирования:
# Invert grayscale image def invertImage(image): return (255-image) # Apply circular mask to image def maskImage(image, radius): y, x = np. ogrid[-radius:radius + 1, -radius:radius + 1] mask = x**2 + y**2 > radius**2 image[mask] = 0 return image # Compute coordinates of loom pins def pinCoords(radius, numPins=200, offset=0, x0=None, y0=None): alpha = np.linspace(0 + offset, 2*np.pi + offset, numPins + 1) if (x0 == None) or (y0 == None): x0 = radius + 1 y0 = radius + 1 coords = [] for angle in alpha[0:-1]: x = int(x0 + radius*np.cos(angle)) y = int(y0 + radius*np.sin(angle)) coords.append((x, y)) return coords # Compute a line mask def linePixels(pin0, pin1): length = int(np.hypot(pin1[0] - pin0[0], pin1[1] - pin0[1])) x = np.linspace(pin0[0], pin1[0], length) y = np.linspace(pin0[1], pin1[1], length) return (x.astype(np.int)-1, y.astype(np.int)-1)
А так же функции для расчёта кругового расположения штифтов, от которых будут натягиваться нитки.
Вся магия происходит здесь:
def main(): # Load image image = cv2. imread(imgPath) print("[+] loaded " + imgPath + " for threading..") # Crop image height, width = image.shape[0:2] minEdge= min(height, width) topEdge = int((height - minEdge)/2) leftEdge = int((width - minEdge)/2) imgCropped = image[topEdge:topEdge+minEdge, leftEdge:leftEdge+minEdge] cv2.imwrite('./cropped.png', imgCropped) # Convert to grayscale imgGray = cv2.cvtColor(imgCropped, cv2.COLOR_BGR2GRAY) cv2.imwrite('./gray.png', imgGray) # Resize image imgSized = cv2.resize(imgGray, (2*imgRadius + 1, 2*imgRadius + 1)) # Invert image imgInverted = invertImage(imgSized) cv2.imwrite('./inverted.png', imgInverted) # Mask image imgMasked = maskImage(imgInverted, imgRadius) cv2.imwrite('./masked.png', imgMasked) print("[+] image preprocessed for threading..") # Define pin coordinates coords = pinCoords(imgRadius, numPins) height, width = imgMasked.shape[0:2] # image result is rendered to imgResult = 255 * np. ones((height, width)) # Initialize variables i = 0 lines = [] previousPins = [] oldPin = initPin lineMask = np.zeros((height, width)) imgResult = 255 * np.ones((height, width)) # Loop over lines until stopping criteria is reached for line in range(numLines): i += 1 bestLine = 0 oldCoord = coords[oldPin] # Loop over possible lines for index in range(1, numPins): pin = (oldPin + index) % numPins coord = coords[pin] xLine, yLine = linePixels(oldCoord, coord) # Fitness function lineSum = np.sum(imgMasked[yLine, xLine]) if (lineSum > bestLine) and not(pin in previousPins): bestLine = lineSum bestPin = pin # Update previous pins if len(previousPins) >= minLoop: previousPins.pop(0) previousPins.append(bestPin) # Subtract new line from image lineMask = lineMask * 0 cv2. line(lineMask, oldCoord, coords[bestPin], lineWeight, lineWidth) imgMasked = np.subtract(imgMasked, lineMask) # Save line to results lines.append((oldPin, bestPin)) # plot results xLine, yLine = linePixels(coords[bestPin], coord) imgResult[yLine, xLine] = 0 #cv2.imshow('image', imgResult) #cv2.waitKey(1) # Break if no lines possible if bestPin == oldPin: break # Prepare for next loop oldPin = bestPin # Print progress #sys.stdout.write("\b\b") #sys.stdout.write("\r") #sys.stdout.write("[+] Computing line " + str(line + 1) + " of " + str(numLines) + " total") #sys.stdout.flush() print("\n[+] Image threaded") # Wait for user and save before exit #cv2.waitKey(0) #cv2.destroyAllWindows() cv2.imwrite('./threaded.png', imgResult) #rgb_img = cv2.cvtColor(imgResult.astype('uint8'), cv2.COLOR_BGR2RGB) #plt.imshow(rgb_img) #plt. show() main()
— картинка загружается, выполняется предварительная обработка, а далее в цикле
# Loop over lines until stopping criteria is reached for line in range(numLines):
перебираются возможные варианты расположения линий.
В качестве критерия оценки пригодности — используется оценка лучшего «затенения», то есть выбирается такая линия, которая покрывает наибольшее количество исходных тёмных областей исходного изображения:
# Fitness function lineSum = np.sum(imgMasked[yLine, xLine])
Результаты предварительной обработки изображения:
— инвертированное изображение:
— на инвертированное изображение наложена круглая маска:
Итоговый результат работы программы:
Вот и всё! Оказалось, что немного Python и OpenCV способны творить и такие интересные штуки для автоматизированной генерации произведений искусства.
Ссылки
string-art/alog2.py
Круглые картины из натянутых ниток
Янтарному подарили портрет Канта из 5 километров ниток
По теме
Робот-художник
Картины нитками в категории «Медикаменты и медицинские товары»
Набір для створення картини нитками по фото
Доставка по Украине
1 699 грн
Купить
Набір для створення картини нитками по фото
Доставка по Украине
1 699 грн
Купить
Набір для створення картини нитками по фото
Доставка по Украине
1 699 грн
Купить
Гр Картини з ниток «The STRING ART» (УКР) STRA-01-01U,02U,03U. ..06U (12) 6 видів, «Danko Toys»
На складе в г. Киев
Доставка по Украине
91 грн
Купить
Набор для создания картины нитью по фото
На складе в г. Вишнёвое
Доставка по Украине
1 999 грн
Купить
Вишнёвое
Набор для создания картины нитью по фото
На складе в г. Вишнёвое
Доставка по Украине
1 999 грн
Купить
Вишнёвое
Набор для создания картины нитью по фото
На складе в г. Вишнёвое
Доставка по Украине
1 999 грн
Купить
Вишнёвое
Набор для создания картины нитью по фото
На складе в г. Вишнёвое
Доставка по Украине
1 999 грн
Купить
Вишнёвое
Набор для создания картины нитью по фото
На складе в г. Вишнёвое
Доставка по Украине
1 999 грн
Купить
Вишнёвое
Модульная картина на холсте из четырех частей KIL Art Абстракция Яркие нити 89×56 см M4M449 ML, код: 2747982
Доставка по Украине
1 398.98 грн
2 938 грн
Купить
Модульная картина на холсте из четырех частей KIL Art Абстракция Яркие нити 89×56 см M4M449 MN, код: 2747982
Доставка по Украине
1 398.98 грн
2 938 грн
Купить
Модульная картина на холсте из четырех частей KIL Art Абстракция Яркие нити 129×90 см M4L449 GR, код: 2746988
Доставка по Украине
1 865.98 грн
3 919 грн
Купить
Модульная картина на холсте из четырех частей KIL Art Абстракция Яркие нити 89×56 см M4M449 GR, код: 2747982
Доставка по Украине
1 398.98 грн
2 938 грн
Купить
Картина з ниток String Art «Fashion Girl» 10100520У
На складе
Доставка по Украине
72 грн
Купить
Картина на холсте Разноцветные нити 50х50 см (H5050_YM011)
Доставка по Украине
575 грн
Купить
Смотрите также
Модульная картина на холсте из четырех частей KIL Art Абстракция Яркие нити 89×56 см M4M449 EM, код: 2747982
Доставка по Украине
1 398. 98 грн
2 938 грн
Купить
Модульная картина на холсте из четырех частей KIL Art Абстракция Яркие нити 129×90 см M4L449 TR, код: 2746988
Доставка по Украине
1 865.98 грн
3 919 грн
Купить
Изысканная вышивка шерстяными нитками. Цветочные композиции, картины с животными.
Доставка по Украине
160 грн
Купить
ИЗОНИТКА набор вел 31х31(11цв) АИСТ С МЛАДОМ картина-панно из нитей мулине (1/10)ДТ
На складе
Доставка по Украине
111.27 грн
Купить
Алмазна картина за номерами Розваги в нитках 50х60 см HA0001 (Strateg)
На складе
Доставка по Украине
1 163 грн
Купить
Гр Картини з ниток «The STRING ART» (УКР) STRA-01-01U,02U,03U…06U (12) 6 видів, «Danko Toys»
Доставка из г. Киев
76 — 109 грн
от 3 продавцов
76 грн
Купить
ІЗОНИТКА набір вел 31х31(11кол) ЛЕЛЕКА З НЕМОВЛЯМ картина-панно з ниток муліне (1/10)ДТ
Доставка по Украине
по 112. 4 грн
от 2 продавцов
112.40 грн
Купить
Картина з ниток муліне STRA-01-03 The STRING ART LOVE (1/12) ДТ
Доставка по Украине
по 67.9 грн
от 2 продавцов
67.90 грн
Купить
ІЗОНИТКА набір мал 21х31(7кол) КОРАБЕЛЬ картина-панно з ниток муліне(1/10)ДТ
Доставка по Украине
96.40 грн
Купить
Творчість. Картина-панно з ниток муліне «ІЗОНИТКА» великий (10)
Доставка по Украине
81.95 — 123 грн
от 4 продавцов
123 грн
Купить
Картина діамантова STRATEG HA0001 Розваги в нитках розм.50х60 см 4 рівень складн. 30 кол.
Доставка по Украине
по 1 256.4 грн
от 2 продавцов
1 256.40 грн
Купить
Творчість. Картина-панно з ниток муліне «ІЗОНИТКА» великий
Доставка по Украине
107 — 108 грн
от 2 продавцов
108 грн
Купить
Творчість. Картина-панно з ниток муліне «ІЗОНИТКА» великий (10)
Доставка по Украине
139 грн
Купить
Набор для вышивания нитками Luca-S Цветы Ирисы по картине Ван Гога
Доставка по Украине
959 грн
Купить
999+ Картинки тем | Скачать бесплатные картинки на Unsplash
999+ Thread Pictures | Скачать Free Images на Unsplash
- ФотоФотографии 702
- Пачка фотографийКоллекции 5. 8k
- Группа людейПользователи 45
шитье
нитки
хлопок 9
1 шаблон
Логотип Unsplash
Unsplash+
В сотрудничестве с JSB Co.
Unsplash+
Unlock
швейная одеждапрофессиональная
амирали мирхашемян
шитьебелые фоныстрока
–––– –––– –––– – –––– – –––– –– – –– –––– – – –– ––– –– –––– – –.
Héctor J. Rivas
волокнотекстильтекстиль
K15 Photos
morogorotanzaniaнити
Faris Mohammed
Коричневый фонslinesparallel
10u1090 Liviu aia Palacemogosoaiaromania
Логотип Unsplash
Unsplash+
В сотрудничестве с Ave Calvar 9Разблокировать
Обои с рисунком HD Polskastyle
Tracey Parish
oncanadatoronto
Vishal Banik
fashionyarncolours
Логотип Unsplash
Unsplash+
В сотрудничестве с Ave Calvar
9
Нико Назер 0010 ontariowwoolknitting
Noor Sethi
Texture backgroundsbhadohiHd абстрактные обои
Tim Mossholder
Hd цветные обоипоездпоездтранспорт
Логотип Unsplash
Unsplash+
При сотрудничестве с Натальей Блаут
Unsplash+
Разблокировка
хлопокгалантерейный комплект
Deepak Rautela
indiatamil nadufocus
шитье одеждапрофессиональная
красочныеHd цветные обоикатушка
Hd узорные обоиpolskastyle
fashionyarncolours
philippineskawiteveryday
Hd цветные обоипоезд тректранспорт
индиатамил надуфокус
–––– –––– –––– – –––– – –––– –– – –– –––– – – –– ––– –– –––– – –.
шитьеБелые фоныстрока
волокнотекстильтекстиль
морогоротанзаниянитки
mogosoaia Palacemogosoaiaromania
макрочерные фоны
oncanadatoronto 90edatoronto 90edle Professionalonto
1
0010 love heartcraftRainbow images & images
ontariowoolknitting
Похожие коллекции
Thread
86 фото · Куратор: Alexandre De Карвальо
The Thread
27 фото · Куратор McKenna Scott
Common Thread
32 фото · Куратор Michaela Spratt
mogosoaia Palacemogosoaiaromania
professionaljobneedlework
philippineskawiteveryday
indiatamil nadufocus
шитьеБелые фоныстрока
morogorotanzaniaнитки
разноцветныеHd цветные обоикатушка
макрочерные фоны
oncanadatoronto
love heartcraftRainbow images & images
90hi
abstract backgroundsbhado хлопчатобумажная галантерея
–––– –––– –––– – – ––– – –––– –– – –– –––– – – –– ––– –– –––– – –.
волокнотекстильтекстиль
Коричневые фоныпараллельные линии
mendingthimbleneedle
fashionyarncolours
Похожие коллекции
Thread
86 фото · Куратор Alexandre De Carvalho
The Thread
27 фото · Куратор McKenna1 Scott 9001
32 фото · Куратор Микаэла Спратт
ontariowwoolknitting
Hd цветные обоипоезд рельстранспорт
Просмотр премиальных изображений на iStock | Скидка 20% на iStock
Логотип Unsplash
Сделайте что-нибудь потрясающее
Бесплатная нить Фотографии и картинки
Связанные изображения из iStock
| Сохранить сейчас
абстрактный
фон
бежевый
Макро бежевый текстиль. Шаблон куба
абстрактный
фон
бежевый
Макро бежевый текстиль.
Шаблон куба
абстрактный
фон
фон
Вертикальные линии из цветной махровой ткани макрос
абстрактный
фон
коричневый
Крупный план натурального бежевого плетения
абстрактный
фон
коричневый
Крупный план натурального бежевого плетения
абстрактный
фон
броан
Вязание крупным планом бежевого цвета
абстрактный
фон
коричневый
Вязание крупным планом бежевого цвета
абстрактный
фон
коричневый
Крупный план натурального бежевого плетения
абстрактный
фон
коричневый
Крупный план натурального бежевого плетения
абстрактный
фон
коричневый
Вязание крупным планом бежевого цвета
текстура
ткань
текстиль
Схема вязания
животное
животные
искусственный
Искусственный серебристый мех 2
животное
животные
искусственный
Искусственный серебряный мех
пляж
Панама
коровы
Коровы на пляже
мяч
клубок шерсти
мячи
Разноцветная шерсть
домашний
литовские тканые створки
Литовский