输入灰度图像输出直方图c语言
时间: 2023-07-13 09:18:44 浏览: 163
以下是一个简单的C语言函数,可以输入一张灰度图像的像素数组,并输出对应的直方图:
```c
void calc_histogram(unsigned char *image, int width, int height, int *histogram) {
// 初始化直方图
for (int i = 0; i < 256; i++) {
histogram[i] = 0;
}
// 计算直方图
for (int i = 0; i < width * height; i++) {
histogram[image[i]]++;
}
// 输出直方图
for (int i = 0; i < 256; i++) {
printf("%d: %d\n", i, histogram[i]);
}
}
```
这个函数接受四个参数:
- `image`:灰度图像的像素数组,每个像素占用一个字节(8位)。
- `width` 和 `height`:图像的宽度和高度,以像素为单位。
- `histogram`:输出的直方图数组,必须预先分配足够的空间,每个元素表示对应灰度值的像素数量。
函数先将直方图数组初始化为全0,然后扫描整个像素数组,统计每个灰度值出现的次数,最后输出整个直方图。
相关问题
输入灰度图像输出直方图图像c语言
以下是一个使用C语言实现灰度图像输出直方图图像的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define IMAGE_WIDTH 256
#define IMAGE_HEIGHT 200
#define HIST_HEIGHT 100
// 计算灰度图像的直方图
void calc_histogram(uint8_t* image_data, uint32_t image_size, uint32_t* histogram)
{
for (uint32_t i = 0; i < image_size; i++) {
histogram[image_data[i]]++;
}
}
// 归一化直方图
void normalize_histogram(uint32_t* histogram, uint32_t size)
{
uint32_t max_val = 0;
for (uint32_t i = 0; i < size; i++) {
if (histogram[i] > max_val) {
max_val = histogram[i];
}
}
for (uint32_t i = 0; i < size; i++) {
histogram[i] = histogram[i] * HIST_HEIGHT / max_val;
}
}
// 绘制直方图
void draw_histogram(uint32_t* histogram, uint8_t* hist_image_data)
{
for (uint32_t y = 0; y < HIST_HEIGHT; y++) {
for (uint32_t x = 0; x < IMAGE_WIDTH; x++) {
if (y >= HIST_HEIGHT - histogram[x]) {
hist_image_data[y * IMAGE_WIDTH + x] = 255;
} else {
hist_image_data[y * IMAGE_WIDTH + x] = 0;
}
}
}
}
int main(int argc, char* argv[])
{
FILE* fp;
uint8_t* image_data;
uint32_t image_size;
uint32_t histogram[256] = { 0 };
uint8_t hist_image_data[HIST_HEIGHT * IMAGE_WIDTH] = { 0 };
// 读取灰度图像文件
if ((fp = fopen("gray_image.raw", "rb")) == NULL) {
printf("Cannot open file.\n");
return -1;
}
fseek(fp, 0, SEEK_END);
image_size = ftell(fp);
image_data = (uint8_t*)malloc(image_size);
fseek(fp, 0, SEEK_SET);
fread(image_data, 1, image_size, fp);
fclose(fp);
// 计算直方图
calc_histogram(image_data, image_size, histogram);
// 归一化直方图
normalize_histogram(histogram, 256);
// 绘制直方图
draw_histogram(histogram, hist_image_data);
// 写入直方图图像文件
if ((fp = fopen("hist_image.raw", "wb")) == NULL) {
printf("Cannot open file.\n");
return -1;
}
fwrite(hist_image_data, 1, HIST_HEIGHT * IMAGE_WIDTH, fp);
fclose(fp);
free(image_data);
return 0;
}
```
在这个示例代码中,我们首先定义了一些常量,包括图像的宽度、高度和直方图的高度。然后,我们定义了三个函数,分别用于计算直方图、归一化直方图和绘制直方图。在主函数中,我们首先读取灰度图像文件,并计算对应的直方图。然后,我们归一化直方图并绘制直方图。最后,我们将直方图图像数据写入文件中。注意,此示例代码仅适用于8位灰度图像。如果您的图像不是8位灰度图像,请相应地修改代码。
灰度图像直方图求取c语言
要求一张灰度图像的直方图,可以按照以下步骤编写 C 代码:
1.读取灰度图像,将像素值存储在一个二维数组中;
2.创建一个长度为256的数组,用于存储每个灰度级别的像素数量;
3.遍历图像像素,每遇到一个像素就在数组中相应的位置加1;
4.将数组中的数据归一化,以便于绘制直方图;
5.将结果输出或保存到文件。
以下是一个示例代码,可以作为参考:
```c
#include <stdio.h>
#include <stdlib.h>
#define WIDTH 512
#define HEIGHT 512
int main()
{
FILE *fp;
unsigned char image[HEIGHT][WIDTH];
int histogram[256] = {0};
int i, j, k;
int max_count = 0;
fp = fopen("lena.raw", "rb");
fread(image, sizeof(unsigned char), WIDTH * HEIGHT, fp);
fclose(fp);
for (i = 0; i < HEIGHT; i++) {
for (j = 0; j < WIDTH; j++) {
k = image[i][j];
histogram[k]++;
}
}
for (i = 0; i < 256; i++) {
if (histogram[i] > max_count) {
max_count = histogram[i];
}
}
for (i = 0; i < 256; i++) {
histogram[i] = (int)((double)histogram[i] / max_count * HEIGHT);
}
for (i = HEIGHT-1; i >= 0; i--) {
for (j = 0; j < 256; j++) {
if (histogram[j] > i) {
printf("*");
} else {
printf(" ");
}
}
printf("\n");
}
return 0;
}
```
其中,`lena.raw` 是一张灰度图像的文件名。代码输出的结果是一个 ASCII 码直方图,可以使用终端查看。
阅读全文