OpenCL 中的图像和过滤器

Images and Filters in OpenCL

假设我有一个名为 Test.jpg 的图像。

我刚刚想出了如何通过以下行将图像引入项目:

FILE *infile = fopen("Stonehenge.jpg", "rb");

现在我有了文件,是否需要将此文件转换为 bmp 图像以便对其应用滤镜?

我以前从未使用过图像,更不用说 OpenCl 了,所以我脑子里有很多东西。

为了我自己的理解,我需要对这部分做进一步的说明

这个 bmp 图像是否也需要存储在一个数组中才能对其应用滤镜?我已经在其他示例中看到多次使用滑动 window 技术。 bmp 图像是否几乎分为 RGB 值 (0-255)?如果有人可以提供关于此项目的 link,应该可以帮助我更好地理解这一点。

我知道这对大多数人来说似乎是一个基本问题,但我的工作场所没有这方面的导师。

Now that I have the file, do I need to convert this file into a bmp image in order to apply a filter to it?

不完全是。 bmp 是一种非常特殊的图像序列化格式,实际上是一种相当复杂的格式(实现一个正确处理所有极端情况的 BMP 文件解析器实际上相当困难)。

但是到目前为止,您所拥有的甚至还不是文件内容数据。你所拥有的是一个 C stdio FILE 句柄,仅此而已。到目前为止,您甚至没有检查文件是否可以打开。这不是很有用。

JPEG 是一种有损压缩图像格式。您需要能够 "work" 的是一个像素值数组。组件元组数组或多个数组,每个组件一个(取决于您的应用程序,这两种格式的性能可能更好)。

现在实现图像格式解码器变得乏味。这不是很困难,但也不是你可以在一个晚上写下来的东西。当然,细节决定成败,编写高质量、涵盖所有极端情况且快速的实现是一项重大工作。这就是为什么对于每种图像(以及视频和音频)格式,您通常只能找到少量的编码器和解码器实现。 JPEG 的实际标准编解码器库是 libjpeg 和 libjpeg-turbo。如果您的目标是阅读 just JPEG 文件,那么这些库将是首选实现。然而,您可能还想支持 PNG 文件,然后可能还想支持 EXR 等等,然后事情又变得乏味了。所以有元库包装所有这些格式特定的库并通过通用 API.

提供它们

在 OpenGL wiki 中有一个关于图像加载器库当前状态的专用页面:https://www.opengl.org/wiki/Image_Libraries

Does this bmp image also need to be stored in an array in order to have a filter applied to it?

这实际上取决于您要应用的过滤器类型。例如,一个简单的阈值过滤器不会考虑像素的周围环境。如果您要执行扫描线信号处理(例如,在处理旧的模拟电视信号时),您可能一次只需要一行像素。

当然是将整个图像保存在内存中的通用解决方案,但是有些图片如此巨大,普通计算机的 RAM 无法容纳它们。像 VIPS 这样的图像处理库实现了可以一次对图像的小部分区域进行操作并且可以独立执行的处理图。

Is the bmp image pretty much split up into RGB values (0-255)? If someone can provide a link on this item that should help me understand this a lot better.

如果您指的是 "pixel array" 而不是 BMP(请记住,BMP 是一种特定的数据结构),则不会。像素分量值可以是任何标量类型和值范围。并且实际上存在颜色空间,其中存在数值区域,这些区域在数学上是必要的,但并不表示实际可感知的颜色。

归结为像素数据时,图像只是标量分量元组的 n 维数组,其中每个分量的值都在给定的值范围内。它没有得到更具体的。只有当您引入颜色空间(RGB、CMYK、YUV、CIE-Lab、CIE-XYZ 等)时,您才赋予这些值特定的颜色含义。并且数据类型的选择或多或少是任意的。您可以使用每个组件 8 位 RGB (0..255)、10 位 (0..1024) 或浮点数 (0.0 .. 1.0);选择权在你。