什么是直方图?C++编程完成一幅图像的直方图的显示功能
时间: 2024-05-10 11:15:19 浏览: 4
直方图是一种统计图表,用于表示数据集中各数值区间的频率分布情况。在图像处理中,直方图可以用于分析图像的亮度、对比度等特征。
以下是一个 C 语言程序,用于计算和显示一幅图像的直方图:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned char BYTE;
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: hist [image file]\n");
return 1;
}
char *filename = argv[1];
FILE *fp = fopen(filename, "rb");
if (!fp) {
printf("Failed to open file: %s\n", filename);
return 1;
}
// 读取 BMP 图像的头文件
BYTE header[54];
fread(header, sizeof(BYTE), 54, fp);
int width = *(int *)&header[18];
int height = *(int *)&header[22];
int bpp = *(int *)&header[28];
int size = width * height * bpp / 8;
// 读取像素数据
BYTE *data = (BYTE *)malloc(size);
fread(data, sizeof(BYTE), size, fp);
fclose(fp);
// 计算直方图
int hist[256] = {0};
for (int i = 0; i < size; i += bpp / 8) {
BYTE gray = 0.2126 * data[i + 2] + 0.7152 * data[i + 1] + 0.0722 * data[i];
hist[gray]++;
}
// 显示直方图
int max_val = 0;
for (int i = 0; i < 256; i++) {
if (hist[i] > max_val) {
max_val = hist[i];
}
}
int scale = 1;
while (max_val / scale > 50) {
scale *= 10;
}
for (int i = 0; i < 256; i++) {
printf("%3d: ", i);
for (int j = 0; j < hist[i] / scale; j++) {
printf("*");
}
printf("\n");
}
free(data);
return 0;
}
```
这个程序读取一个 BMP 格式的图像文件,并计算其灰度值的直方图。直方图以 ASCII 字符的形式输出,每个字符代表一个像素值的频率。输出时将直方图的最大值缩放到不超过 50 行,方便阅读。