假设我有一张名为Test.jpg的图片。
我刚想出如何通过以下方式将图像带入项目:
FILE *infile = fopen("Stonehenge.jpg", "rb");
现在我有了这个文件,是否需要将此文件转换为bmp图像才能对其应用过滤器?
我之前从未使用过图像,更不用说OpenCl了,所以我的头脑中有很多东西。
为了我自己的理解,我需要进一步澄清这部分
这个bmp图像是否也需要存储在数组中才能应用过滤器?我已经看到在其他示例中使用了几次滑动窗口技术。 bmp图像是否几乎分为RGB值(0-255)?如果有人可以提供关于此项目的链接,这应该可以帮助我更好地理解这一点。
我知道这对大多数人来说似乎是一个基本问题,但我在工作场所没有关于这个主题的导师。
答案 0 :(得分:3)
现在我有了这个文件,是否需要将此文件转换为bmp图像才能对其应用过滤器?
不完全是。 bmp
是一种非常具体的图像序列化格式,实际上是一个非常复杂的格式(实现BMP文件解析器,正确处理所有角落案例实际上相当困难)。
然而,到目前为止你所拥有的甚至不是文件内容数据。你所拥有的是一个C stdio FILE
手柄,就是这样。到目前为止,您甚至没有检查文件是否可以打开。这不是很有用。
JPEG是一种有损压缩图像格式。你需要能够“工作”的是一个像素值数组。一个组件元组数组或多个数组,每个组件一个(根据您的应用程序,格式可能表现更好)。
现在实现图像格式解码器变得乏味。这不是很难,但也不是一个晚上你可以写下来的东西。当然,魔鬼在细节中并编写高质量的实现,涵盖所有角落的情况并且快速是一项重大努力。这就是为什么对于每个图像(和视频和音频)格式,你通常只能找到少量的编码器和解码器实现。用于JPEG的事实上的标准编解码器库是libjpeg和libjpeg-turbo。如果您的目标是阅读只是 JPEG文件,那么这些库将成为首选实现。但是你也可能想要支持PNG文件,然后可能是EXR等等,然后事情变得乏味了。因此,有一些元库可以包装所有这些格式特定的库,并通过通用API提供它们。
在OpenGL wiki中,有一个关于图像加载器库当前状态的专用页面:https://www.opengl.org/wiki/Image_Libraries
这个bmp图像是否也需要存储在数组中才能应用过滤器?
这实际上取决于您要应用的过滤器类型。例如,简单的阈值滤波器不考虑像素的周围环境。如果您要执行扫描线信号处理(例如,处理旧的模拟电视信号时),您可能一次只需要一行像素。
通用的解决方案当然是将整个图像保存在内存中,但是有些图片那么巨大,没有普通计算机的RAM可以容纳它们。像VIPS这样的图像处理库可以实现处理图,这些图可以一次对图像的小子区域进行操作,并且可以独立执行。
bmp图像是否几乎分为RGB值(0-255)?如果有人可以提供关于此项目的链接,这应该可以帮助我更好地理解这一点。
如果你的意思是“像素阵列”而不是BMP(记住,BMP是一个特定的数据结构),那么没有。像素分量值可以是任何标量类型和值范围。事实上,在颜色空间中存在数值区域,这些区域在数学上是必要的,但并不代表实际上合理的颜色。
当涉及像素数据时,图像只是标量组件元组的n维数组,其中每个组件的值位于给定的值范围内。它并没有更具体。只有当您引入色彩空间(RGB,CMYK,YUV,CIE-Lab,CIE-XYZ等)时,才能为这些值赋予特定的颜色含义。并且数据类型的选择或多或少是任意的。您可以使用每个组件8位RGB(0..255),10位(0..1024)或浮点(0.0 .. 1.0);选择是你的。