如何在C语言中以像素级别操作图像?

7

我该如何在C语言中读取图片以便直接控制其像素(就像在MATLAB中所做的那样)?

我尝试了旧方法:

FILE *fp;
fp = fopen("C:\\a.tif","r");

这只是给我图像文件的 ascii 表示形式(我想是这样)。

我如何获得对图像的像素级控制,并执行一些基本操作,比如说,反转图像?


1
C语言比你想象的要低级一些。fopen函数提供给你的是原始二进制数据,你需要自己解释这些数据并将其转换为图像,或者使用下面建议的库来处理。 - Breton
@Breton,他特别询问如何解码这些文件,而不是二进制内容。我认为当您希望程序运行速度更快时,C是更好的选择,否则Python提供的PIL已经足够好了。 - Xolve
1
@Breton - 这里的 fopen() 并没有提供原始二进制数据,而是提供文本模式,这意味着在 Windows 上它可能会错误地读取某些文件。 - Chris Lutz
但在Linux和UNIX上就没问题了。 - Artelius
@Xolve他没有这样做,他问如何操作像在Matlab中一样的像素。我从未使用过Matlab,但我怀疑它足够高级,不会强制用户将原始二进制数据解码为图像。我只是指出C不是那么高级,并且如果没有库或编写程序将二进制压缩信息解码为像素数据,则无法理解图像。@Lutz,哦,对了,我猜它需要一个“b”标志或类似的东西?我不知道C是否区分文本和二进制。 - Breton
5个回答

4

可以看一下libtiff,几乎所有的图像格式都有某种形式的标题数据,并且许多格式被压缩以保持合理的文件大小。当然,你可以编写C代码来读取标题并执行解压缩,但没有必要,因为别人已经做过了。在这里查看一些C图像库。

另一个问题是,在进行操作时,您希望将数据保存在哪种形式中——一种常见的选择是24位RGB(即R、G和B每个变量的值从0到255)。在MATLAB中,你还会看到R、G、B作为浮点数,范围从0.0到1.0。或者你可能想要不同的颜色空间(HSV、YUV等)。

请记住,整数运算更快,但可能更加麻烦。


回答 OP 的问题是好的,但也要提醒他们不要重复造轮子。 - JeffH

4

OpenCV 是一个计算机视觉库,但也可以用于“低级”任务。它支持 BMP、DIB、JPEG、JPG、JPE、PNG、PBM、PGM、PPM、SR、RAS、TIFF 和 TIF 格式。


3
使用 libjpeg 处理 jpeg 文件,使用 libtiff 处理 tiff 文件等。还有一种易于操作的选择是gd,它允许处理多种图像格式(PNG、JPEG、GIF 等)。请注意保留 HTML 标记,修改文本内容以更加通俗易懂。

1

有一些开源库可以加载不同类型的图像,而libtiff可以加载tiff格式的图像。如果你只是想玩一下,文件格式并不是非常重要,那么我建议看看netpbm格式(特别是P5和P6)。它很容易编写一个加载器和保存器,当然也是一个很好的练习。


1

MagickWand 是另一个不错的 ImageMagick 选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接