【问题标题】:Read/Write BMP/PNG grey scale image with C or C++使用 C 或 C++ 读取/写入 BMP/PNG 灰度图像
【发布时间】:2016-09-07 06:31:38
【问题描述】:

我正在改写它,因为有人认为它是“离题”和其他一些粗鲁的回应,而没有考虑我的努力和所有搜索,非常感谢锁定我 4 天,因为你们中的两个人认为我没有写一行代码

我会写下我的微不足道的失败并放心,我使用了搜索按钮

我正在使用 C 和 CUDA 进行图像处理项目。我知道问题的核心,但我遇到了一个小问题

读取和写入灰度图像(PNG 或 BMP)作为输入和输出

我的“稍后再考虑”策略与我的同事相同:

1) 使用 Matlab 脚本:[X,map] = imread('xray.png');

地图对于灰度非常无用(对 RGB 文件很有用),但 X 向我返回了一个宽度 x 高度矩阵,其中包含作为各种“亮度”比例的整数

2)使用Matlab中的fprintf函数编写一个3行的xray.txt:

  1. 宽度
  2. 身高
  3. Width*Heigth 行整数,以空格分隔

3) 像这样在 C 中导入数据:

        FILE *image;
        image = fopen("xray.txt","r");
        width=fscanf(image,"%f\n",&width);
        heigth=fscanf(image,"%f\n",&heigth);
        pixels=(float *) calloc(width*heigth, sizeof(float));
        for (int i = 0; i < width*heigth; i++) {
        fscanf(image,"%f ",&pixels[i]);
        }
        fclose(image);

4) OFFTOPIC 图像处理算法的核心,我需要 一个 1D 浮点数组(代码的第二个版本在 CUDA 中)。在处理对抗时,我需要代码相同

5)逆过程:从宽、高、像素,我写了一个xrayout.txt,xrayedges.txt

6) 第二个 MatLab 脚本,从 xrayout.txt & xrayedges.txt 生成 xrayout.bmp & xrayedges.bmp.. 不值得发,是imRead的逆过程

项目本身已经完成,一切都很好,但我真的很烦我找不到“只有 C”的解决方案

是否有人知道一些简单的方法来读取和写入灰度 PNG,知道:宽度、高度、像素值? 有可以导入 BMP 或 PNG 图像的功能吗? 是否需要二维数组没关系,我可以自己解决

注意 1:简单来说,我的意思是“vanilla C”,不使用一些外来库或其他语言(如果是这样,我会坚持使用 MatLab 脚本)

注意 2:我尝试过(多次失败)并在 stackoverflow 和 google 中搜索,发布此帖子是我最后的可能性,所以请温柔

【问题讨论】:

  • 当然,标准 C 中的每个任务都有一个函数来处理人们能想到的每一个任务。只需使用do_what_i_want-函数。说真的:你的问题离题太远了。可以通过简单的搜索来回答。
  • 嗯,转念一想,C/C++ 语言实际上可能有这样的功能。但是两种不同的语言 C 和 C++ 没有。
  • 您可以使用 PGM 格式 (en.wikipedia.org/wiki/Netpbm_format) 这正是您所描述的。我也怀疑 C 中有一个关于加载特定图像格式的内置函数 :) 但你可以自己编写一个加载程序,这将是几个 fscanf() 调用(或 C++ 的文件流读取)。
  • 你应该表现出自己的努力来解决你的问题。这可以在没有任何 C 和 C++ 中的非标准库的情况下完成。您唯一需要做的就是使用 google 或阅读位图文件规范并相应地实现您的东西。为什么要将 0 到 255 之间的整数值放入浮点数组中? (提示0-255可以用1个字节覆盖)
  • @Olaf 我在阅读了所有搜索后发布了它。我付出了一些努力,但发布失败似乎毫无用处。谢谢你看不起我。

标签: c++ c image-processing


【解决方案1】:

我小时候也记住了一些 C++ 规则。可悲的是,如果我要使用它们,我需要再次记住它们。要回答您的问题(我正在尝试这样做),

1.) 我认为您对将图像读入 C++ 感到困惑。 Vanilla C++ 本身没有读取图像的标准库,使用 openCV 或 ITK 工具箱之类的工具来获取相关功能。

2.) 是的,您可以将读取的图像转换为一维浮点数组,但没有内置方法可以自动将该一维浮点数组视为图像,即使存在外部工具箱也是如此。例如。你在 OpenCV 中将图像读入 Mat 对象:从那里开始,你可以用它做任何你想做的事情,甚至将它转换成一个非常长的一维数组。但它不会达到你的目的。

3.) 我的意思是我仍然无法理解 1D 部分,我也喜欢老式的代码,但这只是在推动它,伙计。事实上,我会说,安装 OpenCV,并记住它的文档,你将能够做你提到的所有事情,甚至更多。

【讨论】:

  • 感谢您的帮助 :) 我需要 1D 部分,因为项目的第二部分是在 CUDA 中传输 3 个用于图像处理的函数,而 CUDA 不喜欢 2D 数组
  • 我认为 OpenCV 在开发方面与 CUDA 有很大的联系。试着看看你是否能找到与你想做的事情相关的例子,你可能会找到它的代码。
  • Sigh :(如果我必须使用 OpenCV,我宁愿坚持使用我的 MatLab 函数,然后将 txt 读入浮点数组,反之亦然......我的目标是要成为只使用 C 语言的聪明人,我会研究一下 :)
猜你喜欢
  • 2011-07-18
  • 2015-03-12
  • 2014-12-26
  • 2019-12-03
  • 1970-01-01
  • 2015-10-28
  • 2013-08-03
  • 2012-09-29
  • 2015-12-11
相关资源
最近更新 更多