【问题标题】:How to manipulate an image at pixel level in C?如何在C中以像素级操作图像?
【发布时间】:2010-12-08 07:28:43
【问题描述】:

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

我尝试了旧方法:

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

这只是给了我ascii 形式的图像文件(我认为)。

如何对图像进行像素级控制并执行一些基本操作,例如反转图像?

【问题讨论】:

  • C 的级别比您想象的要低一些。该 fopen 为您提供原始二进制文件,您可以自行决定如何将该二进制文件解释为图像,或者使用下面建议的库。
  • @Breton,他专门询问如何解码这些文件,而不是二进制内容。我觉得当你希望你的程序更快时,C 是一个更好的选择,否则 Python 提供的 PIL 就足够了。
  • @Breton - fopen() 没有提供这样的原始二进制文件,而是提供了文本模式,这意味着它可能会在 Windows 上错误地读取某些文件。
  • 但在 Linux 和 UNIX 上没问题。
  • @Xolve 他没有,他问如何操纵像素,就像他在 matlab 中所做的那样。我从未使用过 matlab,但我怀疑它的高级程度足以不强迫用户将原始二进制数据解码为图像。我只是指出 C 不是那么高级,它不理解没有库的图像,或者没有编写将二进制压缩信息解码为像素数据的程序。 @Lutz,哦,对了,我猜它需要一个“b”标志或什么?我不知道 C 对文本和二进制有任何区别。

标签: c image-processing image-manipulation pixel


【解决方案1】:

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

另一个问题是您希望以何种形式处理数据 - 常见的选择是 24 位 RGB(即 R、G 和 B 的值都在 0 到 255 之间)。在 MATLAB 中,您还可以看到 R、G、B 作为从 0.0 到 1.0 的双精度数。或者您可能需要不同的色彩空间(HSV、YUV 等)。

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

【讨论】:

  • +1 用于回答 OP 的问题,但也提醒他们不要重新发明轮子
【解决方案2】:

要操作 jpeg 文件使用libjpegtiff 文件使用libtiff,等等。

另一个简单的选项是gd,它允许处理多种图像格式(PNG、JPEG、GIF...)。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      ImageMagick 的MagickWand 是另一个不错的选择

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2010-09-16
          • 1970-01-01
          • 2012-10-11
          • 2016-06-18
          • 2014-05-18
          • 1970-01-01
          • 1970-01-01
          • 2014-07-06
          • 1970-01-01
          相关资源
          最近更新 更多