给出一个图像直方图均衡的C语言代码
时间: 2024-03-05 13:54:04 浏览: 21
下面是一份简单的图像直方图均衡的C语言代码,仅供参考:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int width;
int height;
int max_gray;
unsigned char *data;
} PGMImage;
int *get_histogram(PGMImage *image);
void equalize_histogram(PGMImage *image, int *histogram);
int main(int argc, char **argv) {
if (argc != 3) {
printf("Usage: %s input.pgm output.pgm\n", argv[0]);
return 1;
}
FILE *fp = fopen(argv[1], "rb");
if (!fp) {
printf("Failed to open input file: %s\n", argv[1]);
return 1;
}
char magic[2];
fscanf(fp, "%2s", magic);
if (magic[0] != 'P' || magic[1] != '5') {
printf("Invalid PGM file format: %s\n", argv[1]);
fclose(fp);
return 1;
}
PGMImage *image = malloc(sizeof(PGMImage));
fscanf(fp, "%d %d %d", &image->width, &image->height, &image->max_gray);
fgetc(fp);
image->data = malloc(image->width * image->height);
fread(image->data, 1, image->width * image->height, fp);
fclose(fp);
int *histogram = get_histogram(image);
equalize_histogram(image, histogram);
free(histogram);
fp = fopen(argv[2], "wb");
if (!fp) {
printf("Failed to open output file: %s\n", argv[2]);
free(image->data);
free(image);
return 1;
}
fprintf(fp, "P5\n%d %d\n%d\n", image->width, image->height, image->max_gray);
fwrite(image->data, 1, image->width * image->height, fp);
fclose(fp);
free(image->data);
free(image);
return 0;
}
int *get_histogram(PGMImage *image) {
int *histogram = calloc(image->max_gray + 1, sizeof(int));
for (int i = 0; i < image->width * image->height; i++) {
histogram[image->data[i]]++;
}
return histogram;
}
void equalize_histogram(PGMImage *image, int *histogram) {
int *cdf = calloc(image->max_gray + 1, sizeof(int));
int sum = 0;
for (int i = 0; i <= image->max_gray; i++) {
sum += histogram[i];
cdf[i] = sum;
}
for (int i = 0; i < image->width * image->height; i++) {
image->data[i] = cdf[image->data[i]] * image->max_gray / (image->width * image->height);
}
free(cdf);
}
```
该代码实现了对PGM图像的直方图均衡,基本思路是先读取PGM图像,然后计算图像的灰度直方图,接着计算累计分布函数(CDF),最后根据CDF对图像进行均衡化处理。