Как понизить разрешение изображения RAW без дебайера для редактирования на небольших экранах?

У меня вопрос по уменьшению общего размера RAW-изображения без выхода в линейное пространство. Причина в том, что я хочу попытаться отредактировать очень большое мегапиксельное изображение (60+ мегапикселей), но мне не нужно полное изображение при редактировании на экране iPad или iPhone. После редактирования я хочу сохранить оригинал. Скорость сохранения не имеет значения, это редактирование, выполненное на «рабочем» изображении, на котором я просматриваю изменения.

Я хочу сохранить данные RAW, потому что я хочу использовать новые возможности CoreImage RAW и написать несколько собственных RAW CIFilters, но мне не нужно все время работать с гигантским изображением RAW.

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

Я считаю, что может быть два подхода к чтению этого сообщение:

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

Спасибо!


person kineticac    schedule 24.02.2017    source источник


Ответы (1)


Я не очень хорошо знаком с CoreImage или обработкой изображений в Swift/iOS в целом, но позвольте мне попытаться дать вам хотя бы отправную точку.

Необработанное изображение (мозаичное изображение) — это, по сути, одноканальное изображение, где разные пиксели соответствуют разным цветам. Общий макет может выглядеть так:

R G R G 
G B G B
R G R G
G B G B

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

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

Самый простой способ эффективно создать RAW-изображение с более низким разрешением — уменьшить разрешение изображения с помощью целочисленного коэффициента. Для этого нужно просто взять каждый nй суперпиксель по строкам и столбцам, чтобы сформировать новое изображение RAW.

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

Чтобы избежать этого, вы можете применить фильтр сглаживания до того, как вы понизите частоту дискретизации. Однако, поскольку вы еще не выполнили демозаику изображения и ваши разные цветовые каналы (R, G, B) не обязательно коррелированы, вам потребуется применить эту фильтрацию для каждого цветового канала.

Это легко сделать для каналов R и B, которые образуют прямоугольные сетки, но с каналом G значительно сложнее. Возможно, самый простой способ преодолеть эту трудность — применить фильтрацию к обеим прямоугольным сеткам G по всему изображению по отдельности.

Теперь я предполагаю, что большую часть этой функциональности необходимо будет реализовать с нуля, поскольку сглаживание RAW-изображений с понижением частоты дискретизации не является распространенной функцией. Вы можете обнаружить, что значительно экономите время, просто выполняя демозаику исходного RAW, используя предоставленные функции повторной выборки для создания предварительного просмотра с низким разрешением и позволяя корректировать изображение в предварительном просмотре демозаики. Затем, когда вы хотите сохранить редактирование в полном разрешении, вернитесь и примените предварительные изменения к мозаичному изображению RAW в полном разрешении.

Надеюсь, это может послужить отправной точкой.

person Glenn    schedule 25.02.2017
comment
Привет, Гленн, спасибо за ответ! Все это имеет смысл, но я не уверен, как получить доступ к суперпикселю. Большая часть документации говорит об изображениях в линейном пространстве с использованием CoreGraphics, но данные, которые вы получаете, на самом деле не являются суперпикселем изображения RAW. Кроме того, что такое n-й суперпиксель? Откуда ты знаешь, что это такое? - person kineticac; 05.03.2017
comment
Можете ли вы получить доступ к буферу данных пикселей? Если это так, суперпиксели будут 2x2 группами пикселей в этом буфере данных. Как называется объект CoreGraphics, с которым вы взаимодействуете? - person Glenn; 06.03.2017
comment
Конечной целью является использование CIImage для инициализации изображения RAW (developer.apple.com/reference /coreimage/cifilter/), но при редактировании большого RAW-изображения процесс довольно медленный. Понижение разрешения для редактирования было бы идеальным, а затем, когда фотография будет сохранена, она фактически будет использовать полноразмерное изображение. При этом я могу использовать все, что угодно, лишь бы сохранить данные в формате RAW. CoreGraphics получает данные о пикселях, но я не знаю, как с ними работать. Будет ли это способ получить данные: stackoverflow.com/a/10412292/236480. Хотя с этими данными, я не уверен, как это сделать. - person kineticac; 07.03.2017
comment
Самые большие проблемы сейчас: 1. Как мне получить необработанные данные без демозаики в iOS 2. Как сгладить изображение с пониженной частотой дискретизации 3. Как вернуть все метаданные изображения RAW, чтобы CIFilter их понял - person kineticac; 12.05.2017