c - C中的.bmp处理

标签 c image-processing

<分区>

我需要用 C 或 C++(首选 C)编写一个程序,读取黑白 .bmp 并制作一个直方图,其中每个像素的灰度级别(0 到 255)。 我试着寻找可能对我有帮助的图书馆,但到目前为止我还没有找到任何东西,甚至没有开始。 谁能指导我完成这个?我几乎不了解 C,这必须用这种语言来完成。 我看过 OpenCV 和这个 ImageClass.h 库,但没有任何帮助。 我应该如何开始,有没有人有任何 Material 可以帮助我学习如何做到这一点?

最佳答案

要从 C++ 中的 bmp 文件中获取单个像素数据,使用库要容易得多 - 即 stb_image是一个非常简单易用的 header-only-library 用于加载各种图像文件。但是还有许多其他库可以做同样的事情(即 CImgCBitmap 如果你在 Windows 上, FreeImage ,...)。 OpenCV可以加载图像,但它也可以完成更复杂的任务——即对图像数据应用各种通用算法。对于仅仅计算一个简单的直方图,OpenCV 可能有点矫枉过正。

一旦您可以从类似数组的结构中的 bmp 文件访问原始像素数据,计算直方图就很简单了:只需遍历每个像素并根据颜色值增加一个计数器。在灰度图像的情况下,这可以是 0(黑色)、255(白色)或介于两者之间的任何值。直方图只是所有可能颜色的像素频率。

#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"

int main(int argc, char* argv[]) {
  int width, height, bpp;
  unsigned char* pixels = stbi_load("grayscale.bmp", &width, &height, &bpp, 1);
  int histogram[256] = { 0 };
  for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
      histogram[pixels[x + y * height]]++;
    }
  }
  stbi_image_free(pixels);
  return 0;
}

关于c - C中的.bmp处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42618100/

相关文章:

c - 使用 portaudio 和 libsndfile 的可分发应用程序

image-processing - 如何使用opencv在具有某些序列的图像中查找轮廓

python - 有关(精明)边缘检测的一般问题

c# - Basler USB 相机字节缓冲区到图像的转换

c - 使用 GSL 计算矩阵的克罗内克积的有效方法

c - 如何在 C 中存储值 10^20?

c - 使用 memcpy(...) 读取物理地址处的值

ISO C89 中的函数调用计数

python - 挑战:使用python提取弯曲文本

java - 如何在不出现内存不足错误的情况下将巨大的 TIFF 图像转换为 PNG/JPEG?