moytramoytra
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Недавно подкинулась под руку задачка преобразования больших фотографи Земли в удобохранимый/удобопросматриваемый вид. Речь о проекте NASA Blue Marble Next Generation (BMNG), фотографий красивых Земли со спутника, предоставляют в формате без потерь PNG размером до 400Мб на картинку разрешения 21600x21600. Мой выбор пал на JPEG2000 формат, он поддерживает как сжатие без потерь, так и масштабирование, быстрый zoom, извлечение регионов и передача прогрессивная слоями по качеству. Текст был постом на трэкер, возможно какие-то недоправленные моменты остались, поправлю... Итак: Про сам формат можно узнать в гугле... Конвертить в JPEG2000 можно либо фотошопом, а можно сконвертить с помощью бесплатной полнофункциональной тулсы от Kakadu, а просматривать либо ей же (в пакет входит kdu_show, который .jp2 себе в ассоциации прописывает) либо с помощью бесплатной IrfanView (доставить нужно прилагаемый пакет плагинов, чтобы JPEG2000 открывался) или с помощью бесплатной ERViewer (ERViewer7.2Setup_20080212.exe). Кстати, ERViewer создаст .j2i файлик индекса, который позволит в дальнейшем молниеносно открывать .jp2... Конвертировать с помощью kdu_compress (из Kakadu пакета) можно так (примеры http://www.kakadusoftware.com/documents/Usage_Examples.txt и анализ JPEG2000 http://compression.ru/video/codec_comparison/pdf/jpeg2000_codec_comparison_en.pdf): Для качества без потерь (думаю порядка 1.7 гига выйдет): Код: kdu_compress -i image.tif -o image.jp2 -progress 1000 -rate - Creversible=yes Clevels=16 Clayers=16 Stiles={2700,2700} | Либо с потерями (параметр rate указывает насколько сжимать, меньше число - больше потеря и лучше сжатие): Код: kdu_compress -i image.tif -o image.jp2 -progress 1000 -rate 0.5 Creversible=no Clevels=16 Clayers=16 Stiles={2700,2700} | Поясняю параметры: progress - это просто вывод текущего прогресса в конвертации, на сжатие не влияет (не знаю, что за число но 1000 это примерно так чтобы раз в пару секунд сообщало о жизненности ). Clevels - число уровней вэйвлетного преобразования JPEG2000, этот параметр как раз влияет на то, как быстро будет Zoom отрабатывать, т.к. декодируется по уровням качества JPEG2000. Хорошо для больших фоток типа этой ставить порядка 10-15. Ну я тут 16 поставил . По умолчанию равен 5. На сжатие не влияет, но и слишком большой не нужно ставить. Clayers - это ещё один фрактальный параметр сжатия. Если тот был в области размера (т.е. след. уровень это уточнение предыдущего), то здесь в пространстве качества. Точно не знаю алгоритма, потому пока скажу, что параметр позволяет прогрессивно качество передавать. Аналог Progressive JPEG. Если с интернета стриматься будет фотка, то позволяет передавать от грубого качества и далее. Как и пред. параметр уровня, дополнительные слои не несут дополнительных данных, каждый след. слой это уточнение предыдущего. На такой размер фотки порядка 16 поставил бы... Кстати, если бы был просто стриминговый сервер (достаточно прямой ссылки на файл), то можно было бы просто подкачивая нужный начальный кусок файла, можно было бы получать произовольно качественное изображение. Например если качать только первые 5% файла, получим скажем 0.03 бит на пикселей качество, довольно размытое (но гораздо красивее чем у JPEG обычного, без дрожаний краёв). Потом с каждый продолжением, подкачивая файл картинка будет становится всё чётче. Есть 4 параметра, как можно в потоке разворачивать картинку улучшая качество: L=layer; R=resolution; C=component; P=position. Это стандартный порядок, можно любой выбирать. Последняя компонента итерируется быстрее всего, а первая самая глобальная. Т.е. вначале глобально в файлах расположены слои качества отображения (за них отвечает Clayers) начиная от самых грубых, скажем 0.01 бит на пиксел (это типа дрожащего очень пережатого JPEG), далее идёт разрешение (за него отвечает Clevels), это когда изображение вначале от крупных кубиков начинается и заканчиватся подробным разрешением с мелким зерном, потом идёт компонент тайла (т.е. вначале первый тайл кодируется, потом второй и т.п.), и в конце идёт позиция внутри тайла. Этим порядком можно варьировать, тем самым выбирая как будет прогрессировать картинка при подкачке (то ли она начнёт в высоком качестве квадратами/кусками подкачиваться, или всю покаже вначале но размытую или всю покажет но из больших кубиков, которые постепенно начинают детализироваться и т.п.). rate - это собственно параметр сжатия, точнее насколько качество теряется. Измеряется в битах на пиксел. При сжатии без потерь для цветного изображение выходит порядка 4 бит на пиксел, а для чёрно белого около 2. Если стоит "-" (в сочетании с Creversible=yes), то будет сжатие без потерь. Нужно поэкспериментировать (когда у меня будет время и фотки эти ), действительно ли оно bit-identical делает сжатие. Тогда можно использовать JPEG2000 для архивации в замену PNG (сжимать будет в раза два лучше чем PNG не говоря уже о возможности быстрого просмотра огромных фоток...). Что JPEG2000 умеет без потерь так это точно. Нужно просто настроить правильно параметры (для инфы почитайте http://dltj.org/article/lossless-jpeg2000/). Итак, чтобы сжимать с потерями ставим Creversible=no (он no по умолчанию, можно просто не указывать) и rate понижаем. При rate=1 получается бит на пиксел и это изображение Земли будет 86400*43200/8=445Mb. Если rate=0.5 то получим дважды меньше (222Mb). Я бы попробовал просто несколько рэйтов и нашёл бы такой, при котором нет визуальных разних между им и качеством без потерь. Думаю где-то при 0.5 это достигаться будет. ER Mapper рекомендует соотношения сжатие для карт спутниковых ставить равным 25:1, для него rate соотв. равен 8/25=0.32 (8 бит на байт). Т.е. думаю для этой раздачи поэкспериментировать от 0.25 до 1 где-то... Тогда размер файла будет варьировать от 111Мб до 445Мб. Возможно нужно сконвертить в lossless TIFF на вход прежде, если не хватает памяти можно Stiles поменьше сделать (скажем 1024), а если хватает то больше (8192), чтобы сжимало лучше в том же качестве... Для большего сжатия и потерь уменьшать rate.... Creversible - когда yes (по умолчанию no), то сжатие JPEG2000 без потерь, т.е. можно обратно в tif сконвертить и получить идентичное изображение (может разве что с разнецей мета инфы в заголовке). Но для того, чтобы было без потерь нужно обязательно rate либо не выставлять либо равным "-" (значение по умолчанию). Тогда kdu_compress сожмёт и в конце сообщи сколько вышло бит на пиксел... В этой раздаче может порядка 4 бит на пиксел rate получится (что будет около 1.8Гб lossless .jp2). Если указан rate конкретный, то параметр Creversible игнорируется. Но rate всегд ограничивает снизу, если указать 10 например, то сожмётся без потерь и по факту будет скажем 4.2. Очень интересное сочетание Creversible=no и rate равным "-" (или отсутствующим). Это сочетание по умолчанию (если не указать Creversible и rate). Тогда сжатие с потерями, но похоже, что кодек выбирает такое, которое не вносит никакого шума визуального. По идея в таком виде можно все свои RAW фотки с камеры высокого качества пережать и хранить... В моих экспериментах для цветной спутниковой фотки вышло rate около 2.1, а для чёрно белой фотки облаков спутниковых 1.8. Это сочетание параметров думаю стоит поискать и изучить . Итак, чтобы было пережатие вообще без потерь ставим Creversible=yes, rate -. Чтобы с потерями Creversible=no, rate - (и уменьшать rate если нужно сжимать ещё больше). Stiles - указывается размер тайла, кусочка которым будет сжиматься входной файл. Указывается как {tilewidth, tileheight}. Файл разбивается на куски заданного размера и отдельно каждый сжимается. Также и разжимается по тайлам. По идее нет ограничения на какого размера куски - они могут быть не квадратные и не обязательно даже кратны числу особому (например, может быть равным {123, 4567}). По умолчанию равен бесконечному. Т.е. вся картинка одним тайлом сжимается. Хороший размер тайла 5400x5400 для данной раздачич. Для красоты я ставлю обычно квадратные, так чтобы они были кратны обоим сторонам изображения, например 5400x5400 (или 10600x10600) для данного изображения. На скорость расжатия и просмотра изображения не влияет (JPEG2000 за счёт других параметров позволяет частично распаковывать файл, а именно уровней и слоёв, описанных ранее). Но вообще при разжатии, когда отдельные кусочки по ходу уже разжались, их может показывать просмотрщик (что и делает kdu_show). Хотя вся картинка по времени столько же будет разжиматься, но так наглядней постепенная загрузка. Ещё памяти будет меньше съедаться при меньших тайлах, т.к. постепенно по тайлам декодируется. Только немного видны стыки тайлов, артефакты возникают (основная причина, почему лучше одним кодить). Сжатие увеличивается при больших тайлах (используется фрактальность изображения, т.е. похожие кусочки лучше используются, сжимая повторение), но после скажем 500x500 уже нет значительной разницы. Тайлинг обычно часто используется в больших изображениях, например, в том же TIFF. kdu_show - это вторая из утилит Kakadu, которая может просматривать быстро .jp2 формат. Она по умолчанию и выставится на запуск .jp2. Есть ещё в пакете много других утилит, включая утилитку расжатия. Мне пакет очень понравился. Бесплатный для некоммерческого использования и полнофункциональный. Кодирование отрабатывает очень быстро и памяти особо не жрёт... Просмотрщик очень прикольный, позволяет много чего менять при просмотре, например, снижать качество изображения, что позволяет быстрее грузить, менять разрешение, выбирать цветовую компоненту и т.п. По поводу преобразования в TIFF несжатый. Для этого я использую пакет ImageMagick (http://www.imagemagick.org/script/binary-releases.php#windows либо напрямую скачайте отдельно convert.exe). Это утилиты для командной строки для обработки изображений, очень много всего разного делать умеют. Итак из папки ImageMagick запускаем: Код: convert.exe image_in.tif -compress None image_out.tif | Конечно, на вход можно подать любой формат, не только .tif, но и .jpg, .png, .gif и т.д. Выходно .tif будет уже не сжатым и его можно подавать на вход kdu_compress... Кстати, ImageMagick умеет и в .jp2 конвертировать, только использует для этого библиотеку JasPer. А она 1) глючит на огромных изображениях, а точнее просто всего в память его сунет, а это конечно не получится. 2) сгенерированный .jp2 не всеми вьюверами быстро зумается. А так для мелких изображений (с камеры) вполне подойдёт. Параметры читайте на сайте ImageMagick, если интересует, они такие же по смыслы (только названия другие) как в kdu_compress. Советую всем переконвертить TIFF -> JPEG2000 из этой раздачи хотя бы в Lossless .jp2. Это 1) уменьшит размер на процентов 30 2) позволит быстро открывать и просматривать, используя способности JPEG2000 к обработке по кускам... Для информации, фото в этой раздаче это часть проекта BMNG (Blue Marble Next Generation), проведённый в 2004 году. В течение года собирались данные разными видами спутников и сенсоров, чтобы потом скомбинировать в такую красивую Землю. Фотографии есть всех 12 месяцев, можно видеть как меняется покрытие снегом. В кратце из комбинированных данных были следующие - зонидрование океана (из него взята карта глубин), записи облачности спец сенсором (получился накладываемый слой облаков), маска земли и воды (эти данные позволили чётко выделить материки и океан, применив на океане глубинные данные), высотное сканирование с нескольких сенсоров, в США использовался отдельный сенсор, с более точными данными, индекс вегетативный, данные наличия и плотности живой биомассы на Земле (позволил повысить зелёность и дать насыщенность), высотные данные использовались для отрисовки рельефа и наложения теней. Дополнительные сведения и все эти данных (хоть не в исходном, но в качественном уже обработонном виде и сжатые без потерь) доступны здесь (там же будет и .bin.gz с фото этой раздачи (но не TIFF), просто сырые данные, также есть и PNG/JPG): http://mirrors.arsc.edu/nasa/ Это довольно раритетное зеркало, нигде я не встретил проект BMNG в такой полной сборке в исходном формате без потерь. Там в сумме по этому проекту 220Gb данных... Кстати, Next Generation - это от того, что ещё в 2002 году подобный проект был, а это его вторая версия. Из 2002 года взяты тоже данные, а именно индекс вегетативности, покрытие облаков и водная маска Земли. PS. Писал инструкцию на своём непрофессиональном опыте в этом деле, потому возможны неточности и что-то можно улучшить. Думаю Фотошоп тоже умеет сжимать в JPEG2000, потому может и не особо инструкция пригодится, нету фотошопа чтобы проверить . Возможно не так настраивается хорошо набор параметров. Те параметры, что указал это считаю наилучшие в этой раздаче. Подавать на вход сжатия обязательно lossless TIFF вариант, ну и он должен быть Uncompressed, что для этой фотки 10.7Гб составит. Админы/Модераторы, прощайте за прямые ссылки на софт , если это против правил, иначе всё это искать долго (да и софт бесплатный). Если нельзя, поясните, что за причина в том, чтобы не давать ссылок? (всё таки наша же одна из целей на трэкере делиться инфой и делать её простой и доступной...) |