将 CIFilter 保存为 RAW 图像
Save CIFilter as RAW image
因此 CIFilter
接收 RAW DNG 图像。有没有办法可以将图像输出为 RAW?
我正在尝试混合作为 CIFilter
加载的 RAW 图像,然后将它们作为 RAW 输出。它是缓冲区 RAW 值的简单插值。是的,我知道 RAW 照片没有像素。我只是想在这里使用底层的 BAYER 过滤器表示。有什么方法可以使用 CIFilter
来做到这一点。使用第三方库怎么样?
编辑:我正在尝试做的事情:
所以我正在尝试混合(类似于 exposure stacking) multiple images taken using a Bracketed Photo Capture。所以我有多个 RAW 照片的像素缓冲区,我试图对它们的像素值进行平均。
在此之前,我试图确认我的像素值是正确的。所以我拍了一张红绿或蓝 sheet 纸的照片,这样它就变成了一种纯色(差不多),然后我尝试查看像素缓冲区值是否符合我的预期。 iPhone 有 RGGB bayer layout 所以我希望非常纯红色的图片具有以下布局:
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
}
}
无法使用 Core Image 做您想做的事。您可以 "only" 使用 CIFilters
在像素基础上开发和处理 RAW 输入。
但是,您可以使用 CVPixelBufferGetBaseAddress()
(以及一些适当的锁定)直接访问 CVPixelBuffers
的数据。因此,您可以在 CPU 上进行混合,并可能使用 vDSP
来提高性能。
因此 CIFilter
接收 RAW DNG 图像。有没有办法可以将图像输出为 RAW?
我正在尝试混合作为 CIFilter
加载的 RAW 图像,然后将它们作为 RAW 输出。它是缓冲区 RAW 值的简单插值。是的,我知道 RAW 照片没有像素。我只是想在这里使用底层的 BAYER 过滤器表示。有什么方法可以使用 CIFilter
来做到这一点。使用第三方库怎么样?
编辑:我正在尝试做的事情:
所以我正在尝试混合(类似于 exposure stacking) multiple images taken using a Bracketed Photo Capture。所以我有多个 RAW 照片的像素缓冲区,我试图对它们的像素值进行平均。
在此之前,我试图确认我的像素值是正确的。所以我拍了一张红绿或蓝 sheet 纸的照片,这样它就变成了一种纯色(差不多),然后我尝试查看像素缓冲区值是否符合我的预期。 iPhone 有 RGGB bayer layout 所以我希望非常纯红色的图片具有以下布局:
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
}
}
无法使用 Core Image 做您想做的事。您可以 "only" 使用 CIFilters
在像素基础上开发和处理 RAW 输入。
但是,您可以使用 CVPixelBufferGetBaseAddress()
(以及一些适当的锁定)直接访问 CVPixelBuffers
的数据。因此,您可以在 CPU 上进行混合,并可能使用 vDSP
来提高性能。