<分区>
我需要用 C 或 C++(首选 C)编写一个程序,读取黑白 .bmp 并制作一个直方图,其中每个像素的灰度级别(0 到 255)。 我试着寻找可能对我有帮助的图书馆,但到目前为止我还没有找到任何东西,甚至没有开始。 谁能指导我完成这个?我几乎不了解 C,这必须用这种语言来完成。 我看过 OpenCV 和这个 ImageClass.h 库,但没有任何帮助。 我应该如何开始,有没有人有任何 Material 可以帮助我学习如何做到这一点?
<分区>
我需要用 C 或 C++(首选 C)编写一个程序,读取黑白 .bmp 并制作一个直方图,其中每个像素的灰度级别(0 到 255)。 我试着寻找可能对我有帮助的图书馆,但到目前为止我还没有找到任何东西,甚至没有开始。 谁能指导我完成这个?我几乎不了解 C,这必须用这种语言来完成。 我看过 OpenCV 和这个 ImageClass.h 库,但没有任何帮助。 我应该如何开始,有没有人有任何 Material 可以帮助我学习如何做到这一点?
最佳答案
要从 C++ 中的 bmp 文件中获取单个像素数据,使用库要容易得多 - 即 stb_image是一个非常简单易用的 header-only-library 用于加载各种图像文件。但是还有许多其他库可以做同样的事情(即 CImg , CBitmap 如果你在 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/