Negative To Relief это приложение на Python для подготовки рельефов к 3D-печати.
Оно берет изображение, превращает его в карту высот и может сохранить результат в нескольких форматах:
PNGс preview карты высот;G-codeдля FDM-принтера;OBJmesh;STLmesh.
Приложение подходит для сценария, когда нужно превратить негатив или обычное grayscale-изображение в печатный рельеф.
На вход подается изображение:
- негатив;
- обычное черно-белое изображение;
- grayscale-картинка, где яркость определяет высоту.
Дальше приложение:
- переводит изображение в grayscale;
- при необходимости инвертирует его;
- сглаживает и нормализует тон;
- строит heightmap;
- по этой карте высот создает
G-code,OBJ,STLи previewPNG.
В зависимости от выбранного режима и параметров можно получить:
<image>_heightmap.png- preview карты высот;<image>.gcode- файл для печати;<image>.obj- mesh-модель;<image>.stl- mesh-модель для слайсеров и 3D-редакторов.
- Python 3.13+;
numpy;Pillow;- для GUI нужен рабочий
tkinter.
Установка зависимостей:
python3 -m pip install -r requirements.txtЕсли у тебя настроено виртуальное окружение, лучше запускать из него:
source .venv/bin/activate
python main.pyили:
source .venv/bin/activate
python main.py image.jpgЕсть два режима:
- GUI;
- CLI.
Самый удобный вариант для повседневной работы.
Запуск:
python3 main.pyИли сразу с выбранным файлом:
python3 main.py negative.jpg --guiВ интерфейсе можно:
- выбрать входное изображение;
- выбрать папку для результата;
- включить или выключить экспорт
G-code,OBJ,STL; - настроить размер рельефа;
- настроить высоту рельефа и толщину базы;
- настроить сглаживание, гамму и инверсию;
- задать параметры печати.
CLI удобен для повторяемых запусков, автоматизации и точных параметров.
Базовый запуск:
python3 main.py negative.jpgПо умолчанию рядом с исходным изображением будут сохранены:
negative_heightmap.pngnegative.gcode
Сгенерировать только preview и G-code:
python3 main.py negative.jpgСгенерировать G-code, OBJ и STL:
python3 main.py negative.jpg \
--obj-out output/relief.obj \
--stl-out output/relief.stl \
--gcode-out output/relief.gcodeСгенерировать только mesh без G-code:
python3 main.py negative.jpg \
--no-gcode \
--obj-out output/relief.obj \
--stl-out output/relief.stlПример с параметрами печати и обработки:
python3 main.py negative.jpg \
--width-mm 140 \
--relief-height-mm 2.8 \
--base-thickness-mm 1.0 \
--layer-height-mm 0.2 \
--line-width-mm 0.4 \
--autocontrast \
--gamma 0.9 \
--blur-radius 0.8 \
--obj-out output/relief.obj \
--stl-out output/relief.stl \
--gcode-out output/relief.gcode--width-mm- физическая ширина модели.--depth-mm- физическая глубина модели. Если не указать, она считается по пропорциям изображения.--relief-height-mm- максимальная высота рельефа над базой.--base-thickness-mm- толщина сплошной подложки.
--resolution-xи--resolution-y- разрешение сетки heightmap.--blur-radius- сглаживание, полезно для шумных изображений.--gamma- усиление или ослабление контраста по высоте.--autocontrast- автоматическая растяжка тонального диапазона.
По умолчанию приложение предполагает, что подается негатив, и инвертирует изображение.
Если исходник уже является обычной картой высот или позитивом, используй:
--no-invert--no-gcode- не создаватьG-code.--obj-out- путь кOBJ.--stl-out- путь кSTL.--heightmap-out- путь к previewPNG.--gcode-out- путь кG-code.
--line-width-mm- ширина линии экструзии.--layer-height-mm- высота слоя.--filament-diameter-mm- диаметр филамента.--print-speed- скорость печати.--first-layer-speed- скорость первого слоя.--travel-speed- скорость холостых перемещений.--z-speed- скорость по осиZ.--z-hop-mm- высотаZ-hop.--origin-x-mm,--origin-y-mm- стартовая позиция на столе.--nozzle-temperature,--bed-temperature,--fan-speed- базовые параметры печати.
- Возьми изображение с хорошим контрастом.
- Запусти GUI или CLI.
- Сначала сгенерируй preview heightmap.
- Проверь, что светлые и темные области дают нужный рельеф.
- При необходимости скорректируй
gamma,blur,autocontrast,relief-height. - После этого генерируй
G-codeилиSTL. - Перед реальной печатью открой результат в слайсере или G-code viewer.
G-codeуниверсальный и не содержит стартового профиля именно под твой принтер.- Температуры, скорости и стартовые координаты стоит проверить под свою машину.
- Перед реальной печатью обязательно посмотри превью слоев в слайсере.
- Для больших изображений
OBJи особенноSTLмогут получаться тяжелыми.
Если видишь что-то вроде:
macOS 26 (...) or later required
обычно это значит, что numpy, Pillow или Tk установлены в виде бинарников, собранных под более новый macOS.
Попробуй:
python3 -m pip uninstall -y numpy pillow
python3 -m pip install --no-binary=:all: numpy pillowЕсли проблема именно в GUI, проверь, что Python установлен с рабочим tkinter.
Если приложение пишет, что GUI не может стартовать безопасно, чаще всего причина одна из этих:
- в Python нет
tkinter; Tkнесовместим с текущим macOS;- используется не тот Python, из которого создавалось рабочее окружение.
В таком случае:
- попробуй запуск из рабочего
venv; - если не помогает, используй CLI;
- при необходимости поставь совместимый Python и пересоздай
venv.
Если нужен самый простой сценарий:
python3 main.pyЕсли нужен управляемый сценарий через консоль:
python3 main.py image.jpg --obj-out out/model.obj --stl-out out/model.stl