Сохранить CIFilter как изображение RAW

Итак, CIFilter принимает изображение в формате RAW DNG. Есть ли способ вернуть изображение в формате RAW?

Я пытаюсь смешать изображения RAW, загруженные как CIFilter, а затем вывести их как RAW обратно. Это простая интерполяция значений RAW буфера. Да, я понимаю, что на фотографиях в формате RAW нет пикселей. Я просто пытаюсь работать с базовым представлением фильтра BAYER. Есть ли способ сделать это с помощью CIFilter. Как насчет использования сторонней библиотеки?

РЕДАКТИРОВАТЬ: что я пытаюсь сделать:

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

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

        Col0 Col1 Col3 Col4...
Row 0: [HIGH LOW  HIGH LOW ....]
Row 1: [LOW  LOW  LOW  LOW ....]
Row 2: [HIGH LOW  LOW  LOW ....] 

Для этого у меня есть следующий код:

func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
        guard error == nil else { print("Error capturing photo: \(error!)"); return }

        guard let pixelBuffer = photo.pixelBuffer else {return}
        guard let baseAddress = CVPixelBufferGetBaseAddress(pixelBuffer) else {return}
        let bufferHeight = Int(CVPixelBufferGetHeight(pixelBuffer))

        let uint16Buffer = baseAddress.assumingMemoryBound(to: UInt16.self)

        for row in 0..<bufferHeight {
            let col0 = uint16Buffer[row*bufferWidth + 0]
            let col1 = uint16Buffer[row*bufferWidth + 1]
            let col2 = uint16Buffer[row*bufferWidth + 2]
            let col3 = uint16Buffer[row*bufferWidth + 3]
            print(col0, col1, col2, col3) // See pixel values
            if (row > 3) {break} // don't print more than 4 rows for debugging
        }

    }

person QuantumHoneybees    schedule 25.11.2019    source источник


Ответы (1)


Невозможно делать то, что вы хотите, с Core Image. Вы можете "только" разрабатывать и обрабатывать входной RAW-файл на пиксельной основе с CIFilters.

Однако вы можете получить доступ к данным CVPixelBuffers напрямую с помощью CVPixelBufferGetBaseAddress() (и некоторой надлежащей блокировки). Таким образом, вы можете выполнять смешивание на процессоре и, возможно, использовать vDSP для повышения производительности.

person Frank Schlegel    schedule 25.11.2019
comment
Есть идеи, как бы перебрать буфер, чтобы получить необработанные значения? Я пытаюсь извлечь их значения с помощью этого инструкции потока, но я никуда не денусь - person QuantumHoneybees; 25.11.2019
comment
Не могли бы вы подробнее рассказать о проблемах, с которыми вы сталкиваетесь? А какое смешивание вы хотите применить? Вы уверены, что это семантически правильно для изображений RAW? - person Frank Schlegel; 25.11.2019
comment
Ты прав. вопрос был слишком расплывчатым. подробно рассказал о проблемах, с которыми я сталкиваюсь, и отредактировал сообщение - person QuantumHoneybees; 25.11.2019