2026-09-12 · Обновлено 2026-09-13

Карты глубины 16 бит: как убрать бандинг и проверить PNG

Исправьте ступенчатую или инвертированную карту глубины: воспроизводимый тест PNG 8 и 16 бит, скрипт проверки файла и чек-лист импорта в Blender.

Карты глубины 16 бит: как убрать бандинг и проверить PNG

Последнее обновление: 13 сентября 2026 г. Измерения кодирования ниже выполнены на синтетическом градиенте и не являются тестом точности глубины, оцененной ИИ.

В браузере карта глубины выглядит гладкой, но после смещения поверхность покрывается террасами. Вы экспортируете «16-битный PNG» — и ничего не меняется. Прежде чем генерировать новое изображение или повышать плотность сетки, выясните, на каком этапе значения стали ступенчатыми. Одно расширение файла на этот вопрос не ответит.

Краткий ответ: как избежать бандинга на карте глубины?

Используйте 16-битный PNG в оттенках серого, экспортированный напрямую из значений глубины модели с плавающей запятой, если следующее приложение его поддерживает. Не пропускайте карту через 8-битный предпросмотр, скриншот, JPEG или компрессор фотографий. Затем, прежде чем тестировать смещение, проверьте разрядность выборки, диапазон и число различных значений в файле.

16-битный контейнер не восстанавливает потерянную точность. В нашем воспроизводимом эксперименте градиент, закодированный сразу в 16 бит, сохранил 4096 различных значений, а 8-битный градиент, пересохраненный как 16-битный, — всего 256. При этом оба 16-битных файла сообщали одинаковую разрядность выборки и полный числовой диапазон.

Что этот способ исправляет, а что — нет

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

Основные понятия объясняет наше введение в карты глубины. Для реального экспорта генератор карты глубины по умолчанию выдает 16-битный PNG в оттенках серого, указывает, означает ли белый цвет близкое или далекое, и позволяет инвертировать глубину.

ИИ-обработка в этом инструменте сохраняет значения с плавающей запятой вплоть до финального кодирования. Если инструмент предупреждает, что вместо этого использовал резервный метод на основе краев и размытия, этот метод начинается с 8-битных значений, поэтому его 16-битный PNG содержит не более 256 уровней.

Что выбрать: глубину 8 бит, 16 бит или с плавающей запятой?

Следующая задача Что выбрать, если поддерживается Что проверить перед продолжением
Быстрая маска или черновой предпросмотр 8-битный PNG в оттенках серого Допускает ли эффект видимые ступени значений
Плавное смещение по нормализованной глубине 16-битный PNG в оттенках серого, экспортированный напрямую Что исходник не был заранее урезан до 8 бит
Конвейер, которому нужны сырые значения с плавающей запятой Документированный приложением формат с плавающей запятой, часто EXR Единицы, недопустимые значения, нормализацию и соглашение импорта
Инструмент, принимающий только 8-битные изображения Сохраните высокоточный мастер и экспортируйте 8-битную копию Сохраняют ли предпросмотр и итоговый результат достаточно деталей

Разрядность выборки PNG измеряется для каждого канала, а не как сумма всех каналов. «32-битный» RGBA PNG хранит по 8 бит в каждом из четырех каналов, поэтому значение серого, скопированное во все каналы, по-прежнему имеет лишь 256 уровней. Спецификация PNG от W3C допускает для оттенков серого разрядность выборки 1, 2, 4, 8 и 16 бит; формата выборки с плавающей запятой в PNG нет.

Схема сравнения 256 уровней серого при 8 битах и 65 536 уровней серого при 16 битах

Схема описывает емкость кодирования, а не точность модели и не число значений, которое должно быть в каждом изображении. Однородная поверхность вполне законно может использовать одно значение. И файл большего размера не доказывает, что оценка лучше.

Что измерил наш эксперимент с 8 и 16 битами?

Мы создали горизонтальный градиент 4096 × 64 пикселя с 4096 равномерно распределенными значениями от нуля до единицы. Затем закодировали его тремя способами с помощью NumPy и Pillow, заново открыли каждый PNG и измерили заголовок, число различных значений, диапазон и максимальную нормализованную ошибку относительно исходного градиента.

Путь кодирования Разрядность выборки PNG Различных значений после декодирования Максимальная нормализованная ошибка Размер файла, байт
Градиент float → 8 бит 8 256 0,001953602 528
Градиент float → 16 бит 16 4096 0,000007602 848
Градиент float → 8 бит → 16 бит 16 256 0,001953602 819

На третьем пути каждое 8-битное целое умножалось на 257. Ноль остается нулем, а 255 превращается в 65 535, поэтому диапазон выглядит правильным. Но промежуточные значения, потерянные при первом преобразовании, так восстановить нельзя. Именно поэтому проверка одной лишь пометки «16 бит» или самого яркого пикселя пропускает важный вид сбоя.

Столбчатая диаграмма измеренных значений: 256 для 8 бит, 4096 для прямых 16 бит, 256 для 8 бит в 16-битном файле

Эти крошечные файлы состоят из повторяющихся строк и очень легко сжимаются. Их размер в байтах не позволяет прогнозировать размер фотографий. Эксперимент изолирует квантование: он не сравнивает модели глубины, не проверяет рендеры в Blender и не измеряет качество физической гравировки. Иллюстрации WebP на этой странице — поясняющая графика, а не точные карты для скачивания.

Чтобы воспроизвести все три файла, установите NumPy и Pillow в окружение Python и выполните:

import numpy as np
from PIL import Image

ramp = np.tile(np.linspace(0, 1, 4096), (64, 1))
a8 = np.rint(ramp * 255).astype(np.uint8)
a16 = np.rint(ramp * 65535).astype(np.uint16)
wrapped = a8.astype(np.uint16) * 257
for name, values in [("ramp-8", a8), ("ramp-16", a16),
                     ("ramp-8-in-16", wrapped)]:
    Image.fromarray(values).save(name + ".png")

Как проверить скачанный PNG?

Запустите скрипт на исходном скачанном файле, пока другое приложение не пересохранило его. Скрипт использует те же пакеты Python, что и эксперимент, и ожидает одноканальный PNG. На RGB-предпросмотре он намеренно останавливается, а не превращает его молча в данные глубины, которые лишь выглядят корректными.

from pathlib import Path
import numpy as np
from PIL import Image

path = Path("depth.png")
raw = path.read_bytes()
assert raw[:8] == b"\x89PNG\r\n\x1a\n"
assert raw[12:16] == b"IHDR"
print("PNG sample depth:", raw[24])
print("PNG color type:", raw[25])  # 0 = grayscale
values = np.asarray(Image.open(path))
assert values.ndim == 2, "Inspect the grayscale export, not an RGB preview"
print("Range:", int(values.min()), int(values.max()))
print("Distinct values:", np.unique(values).size)
  • Убедитесь, что проверяете файл в оттенках серого, а не цветной предпросмотр.
  • При экспорте в 16 бит разрядность выборки должна быть равна 16.
  • Проверьте, подходит ли числовой диапазон вашему конвейеру.
  • Оценивайте число различных значений по содержимому: универсального порога нет.
  • Осмотрите плавный склон — на нем плато заметнее всего.
  • Повторяйте проверку после любого преобразования, способного снизить точность.

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

Почти черный предпросмотр тоже требует правильной интерпретации. Сырая глубина, записанная в узком числовом диапазоне, может быть вполне корректной для программы, которая будет ее читать. Нормализуйте только копию и только если следующему инструменту нужна нормализованная глубина; сохраните оригинал и любые метаданные масштаба. Базовые проверки размеров и формата описаны в нашем руководстве по проверке изображений: оно объясняет, что обычные свойства файла могут сообщить, а что — нет.

Почему исправный файл все равно выглядит неправильно в Blender?

Работайте с картой как с числовыми данными. В узле Image Texture установите цветовое пространство Non-Color, чтобы не применялось преобразование для отображения. Подключите изображение к подходящему входу высоты или смещения, проверьте метод смещения в материале и убедитесь, что у сетки достаточно геометрии для настоящего смещения.

Документация Blender по смещению отделяет bump mapping, который меняет только затенение, от настоящего смещения, которое двигает поверхность и потому требует мелко подразделенной геометрии. Bump не может изменить силуэт. Расположение меню зависит от версии, поэтому пользуйтесь документацией для установленной у вас версии.

Диагностика в три шага: сравнить исходную оценку, проверить экспортированный PNG, затем настройки импорта

Симптом Что проверить сначала Следующий полезный тест
Регулярные террасы на пологом склоне Квантование или промежуточное преобразование в 8 бит Сравнить исходный скачанный файл с импортированным
Объект переднего плана становится вдавленным Соглашение «близко/далеко» или знак смещения Инвертировать один раз и сравнить с известной точкой переднего плана
Угловатый силуэт при гладкой карте Недостаточная геометрия или неверный режим смещения Проверить больше геометрии на небольшом участке сетки
Стекло, волосы или отражения дают странные формы Интерпретация сцены моделью Сравнить оценку с исходной фотографией
Карта в просмотрщике почти черная Числовой диапазон или обработка отображения Проверить сырые минимум и максимум до настройки уровней

Во время тестов держите масштаб смещения умеренным. Прежде чем добавлять детали, проверьте Midlevel, UV-развертку, кадрирование и соотношение сторон. Если менять все настройки сразу, будет трудно понять, какой шаг вызвал ошибку.

Надежный чек-лист от экспорта до импорта

Перед экспортом:

  1. Храните исходное фото вместе с оригинальной скачанной картой глубины.
  2. Выберите изображение с четким разделением переднего и заднего плана.
  3. Проверьте границы объектов до выбора формата экспорта.
  4. Экспортируйте 16-битный PNG в оттенках серого напрямую, если конвейер его поддерживает.
  5. Запишите, означают ли светлые пиксели в этом экспорте близкое или далекое.

После скачивания:

  1. Проверьте заголовок, диапазон и различные значения сохраненного файла.
  2. Импортируйте его как данные и сверьте направление с известной точкой сцены.
  3. Протестируйте небольшой участок с подходящей геометрией до полного рендера.
  4. Сохраните высокоточный мастер перед любым преобразованием для совместимости.
  5. Сохраните рабочие настройки, чтобы сравнивать будущие экспорты.

Не пропускайте мастер карты глубины через привычный процесс сжатия изображений. Облегченное изображение для показа и надежное числовое поле предъявляют разные требования. Точно так же универсальный ИИ-апскейлер может выдумать текстуру, которая превратится в нежелательную геометрию, если интерпретировать ее как высоту.

Если конечная цель — приложение для рельефа или гравировки, отдельно проверьте, как оно по документации обрабатывает выборки и в каком направлении читает оттенки серого. Вывод на станке в этой статье не тестировался. Одна лишь глубина относительно камеры не задает толщину рельефа, физические единицы или параметры обработки.

Часто задаваемые вопросы

Делает ли 16-битная глубина оценку ИИ точнее?

Нет; она позволяет сохранить более тонкие выходные значения, но не исправляет ошибки модели в интерпретации сцены.

Уберет ли бандинг преобразование 8-битного PNG в 16-битный?

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

Почему в 16-битном PNG всего 256 различных значений?

Возможно, файл прошел через 8-битный этап, хотя простое изображение вполне может законно содержать так мало значений.

Всегда ли белый цвет на карте глубины означает близкое?

Нет; соглашения различаются, поэтому смотрите пометку «близко/далеко» в инструменте экспорта и проверяйте ее по известной точке переднего плана.

Можно ли использовать JPEG как карту смещения?

Рендерер может его принять, но сжатие с потерями делает JPEG плохим мастером для хранения точных значений глубины.

Точнее ли 32-битный RGBA PNG, чем 16-битный PNG в оттенках серого?

Не для карты глубины в оттенках серого: «32 бита» RGBA означают четыре 8-битных канала, поэтому каждое значение серого остается в пределах 256 уровней, если только инструмент намеренно не распределяет глубину по нескольким каналам.

Почему предпросмотр в браузере выглядит одинаково для обоих файлов?

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

Может ли эта карта глубины дать точные реальные измерения?

Нет; нормализованная относительная оценка не задает физических расстояний и не восстанавливает невидимую геометрию.

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

Обложка статьи «Конвертация HEIC в JPG: Сравнение бесплатных инструментов и пакетных методов»

2026-07-26

Конвертация HEIC в JPG: Сравнение бесплатных инструментов и пакетных методов

Конвертируйте фотографии HEIC с iPhone в JPG с помощью бесплатных онлайн-инструментов для web, Mac, Windows и командной строки. Мы сравнили их по скорости, поддержке пакетной обработки и удобству использования.