2017-03-06 45 views
1

我需要用C或C++(C语言的首选项)来执行程序,该程序读取黑白色的.bmp文件,并在每个像素中生成灰度级别(0到255)的直方图。 我试图寻找可能帮助我的图书馆,但到目前为止我还没有找到任何东西,甚至没有开始。 任何人都可以通过这个指导我吗?我在C中实际上没有任何知识,而这必须用这种语言来完成。 我看过OpenCV和这个ImageClass.h库,但没有任何帮助。 我该如何开始,有没有人有任何实际可能帮助我学习的材料?.bmp在C中的处理

+0

欢迎来到Stack Overflow。请花些时间阅读[The Tour](http://stackoverflow.com/tour),并参阅[帮助中心](http://stackoverflow.com/help/asking)中的资料,了解您可以在这里问。 –

+0

这些类型的问题在这里明确地表示为_off-topic_。从此[帮助中心文章](http://stackoverflow.com/help/on-topic)阅读第4点。 –

+0

提示:'int freq [256];' – user4581301

回答

1

要从C++中的bmp文件中获取单个像素数据,使用库变得更加容易 - 即使用stb_image是一个使用仅头文件库来加载各种图像文件的简单方法。但是还有很多其他的库,可以做同样的事情(例如,如果你在windows上,则为CImgCBitmapFreeImage,...)。 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; 
} 
+0

谢谢,你真的帮了我很多,我几乎用OpenCV的。我试试你推荐的那个。再次感谢。 –

+0

@RodrigoDias不客气!如果答案对您有帮助,请点击答案左侧的复选标记,将其标记为已接受的答案。谢谢! – Constantin