ios - 如何在没有去拜耳的情况下对 RAW 图像进行下采样以在较小的屏幕上进行编辑?

标签 ios swift image core-image cifilter

我有一个关于在不进入线性空间的情况下减小 RAW 图像的整体大小的问题。原因是,我想尝试编辑非常大的百万像素图像(60+ 百万像素),但在 iPad 或 iPhone 屏幕等设备上编辑时不需要完整图像。编辑完成后,我确实想保存原件。保存速度不是问题,重要的是对我正在预览编辑的“工作”图像所做的编辑。

我想保留 RAW 数据,因为我想利用新的 CoreImage RAW 功能并编写一些我自己的 RAW CIFilters,但不需要一直处理巨大的 RAW 图像。

如果这可以用 Swift 或任何我可以桥接的语言来完成,那就更好了。实际调整大小不必非常快,甚至可能在开始编辑之前就一次性完成。

我相信阅读 this post 可能有两种方法:

  1. 将 RAW 图像去拜耳化为线性空间,然后调整大小,然后转换回拜耳格式 RAW,但我不知道我是否可以通过这种方式保留下采样中的数据。
  2. 通过某种因素以某种方式操纵尺寸以使其变小。但这是我需要帮助理解的。

谢谢!

最佳答案

一般来说,我不太熟悉 CoreImage 或 Swift/iOS 中的图像处理,但让我试着至少给你一个起点。

原始图像(马赛克图像)本质上是单 channel 图像,其中不同的像素对应不同的颜色。常见的布局可能如下所示:

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

请注意,在这种排列中(这对于大多数镶嵌文件很常见,但有明显的异常(exception)),每个 2x2 像素组在图像中重复。为了调整大小,这些 2x2 区域可以被视为超像素。

我假设您可以从文件或内存中访问图像缓冲区的像素数据。

有效生成较低分辨率 RAW 图像的最简单方法是按整数因子下采样图像。为此,您只需沿行和列提取每第 n 个超像素以形成新的 RAW 图像。

但是,此操作可能会导致图像伪影,例如 Aliasing出现在您的图像中,因为您可能会将新 RAW 图像的奈奎斯特频率降低到低于原始 RAW 图像中最高频率内容的频率。

为避免这种情况,您需要应用 Anti-Aliasing Filter在你的下采样之前。但是,由于您尚未对图像进行去马赛克处理,并且不同的颜色 channel (R、G、B)不一定相关,因此您需要对每个颜色 channel 应用此过滤。

这对于形成矩形网格的 R 和 B channel 很容易实现,但 G channel 要困难得多。也许克服这一困难的最简单方法是分别对图像中的两个矩形 G 网格应用过滤。

现在,我假设大部分功能都需要从头开始实现,因为 RAW 图像抗锯齿下采样不是常见功能。您可能会发现,通过简单地对原始 RAW 进行去马赛克、使用提供的重采样功能生成低分辨率预览并允许对去马赛克预览进行图像调整,可以节省大量时间。然后,当您想要保存全分辨率编辑时,返回并将预览的更改应用到全分辨率、镶嵌的 RAW 图像。

希望这可以提供一些起点。

关于ios - 如何在没有去拜耳的情况下对 RAW 图像进行下采样以在较小的屏幕上进行编辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42429439/

相关文章:

ios - 如何防止具有物理主体的 SKSpriteNode 在与其他 Sprite 碰撞时移动?

ios - 可以向上滚动具有几行的 Swift TableView

java - 将图像转换为颜色数组

image - 使用 <h :graphicImage> or <img> tag 从 webapps/webcontext/deploy 文件夹外部加载图像

c# - StackOverFlowException - 但显然没有递归/无限循环

ios - 如何限制 GCDWebServer 中允许的 IP 的连接

ios检测心率

ios - Xamarin.IOS 切换按钮?

ios - UICollectionView 不呈现所有行

Swift - 从 uilabel 中删除最后输入的数字