你能写一个直方图匹配的代码吗
时间: 2023-04-03 16:03:20 浏览: 58
可以的,以下是直方图匹配的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_GRAY_LEVEL 256
int main()
{
int i, j, k;
int gray_level, pixel_num;
int in_hist[MAX_GRAY_LEVEL] = {0};
int out_hist[MAX_GRAY_LEVEL] = {0};
int in_gray[MAX_GRAY_LEVEL] = {0};
int out_gray[MAX_GRAY_LEVEL] = {0};
int in_pixel[MAX_GRAY_LEVEL] = {0};
int out_pixel[MAX_GRAY_LEVEL] = {0};
double in_prob[MAX_GRAY_LEVEL] = {0};
double out_prob[MAX_GRAY_LEVEL] = {0};
double in_cum_prob[MAX_GRAY_LEVEL] = {0};
double out_cum_prob[MAX_GRAY_LEVEL] = {0};
int in_min_gray = MAX_GRAY_LEVEL - 1;
int out_min_gray = MAX_GRAY_LEVEL - 1;
int in_max_gray = 0;
int out_max_gray = 0;
int in_sum = 0;
int out_sum = 0;
int in_mean = 0;
int out_mean = 0;
int in_std_dev = 0;
int out_std_dev = 0;
int in_min_value = 0;
int out_min_value = 0;
int in_max_value = MAX_GRAY_LEVEL - 1;
int out_max_value = MAX_GRAY_LEVEL - 1;
int in_new_gray[MAX_GRAY_LEVEL] = {0};
int out_new_gray[MAX_GRAY_LEVEL] = {0};
int in_new_pixel[MAX_GRAY_LEVEL] = {0};
int out_new_pixel[MAX_GRAY_LEVEL] = {0};
int in_new_value, out_new_value;
FILE *in_file, *out_file;
char in_file_name[100], out_file_name[100];
printf("请输入输入图像文件名:");
scanf("%s", in_file_name);
printf("请输入输出图像文件名:");
scanf("%s", out_file_name);
if ((in_file = fopen(in_file_name, "rb")) == NULL)
{
printf("无法打开输入图像文件!\n");
exit(1);
}
if ((out_file = fopen(out_file_name, "wb")) == NULL)
{
printf("无法创建输出图像文件!\n");
exit(1);
}
fseek(in_file, 0L, SEEK_END);
pixel_num = ftell(in_file);
fseek(in_file, 0L, SEEK_SET);
for (i = 0; i < pixel_num; i++)
{
gray_level = fgetc(in_file);
in_hist[gray_level]++;
}
for (i = 0; i < MAX_GRAY_LEVEL; i++)
{
in_prob[i] = (double)in_hist[i] / pixel_num;
in_cum_prob[i] = in_prob[i] + (i == 0 ? 0 : in_cum_prob[i - 1]);
in_gray[i] = i;
in_pixel[i] = in_hist[i];
in_sum += i * in_hist[i];
if (in_hist[i] > 0 && i < in_min_gray)
in_min_gray = i;
if (in_hist[i] > 0 && i > in_max_gray)
in_max_gray = i;
}
in_mean = in_sum / pixel_num;
for (i = 0; i < MAX_GRAY_LEVEL; i++)
{
in_std_dev += (i - in_mean) * (i - in_mean) * in_hist[i];
}
in_std_dev = (int)sqrt(in_std_dev / pixel_num);
for (i = 0; i < MAX_GRAY_LEVEL; i++)
{
in_new_value = (int)((MAX_GRAY_LEVEL - 1) * in_cum_prob[i] + 0.5);
if (in_new_value < 0)
in_new_value = 0;
if (in_new_value > MAX_GRAY_LEVEL - 1)
in_new_value = MAX_GRAY_LEVEL - 1;
in_new_gray[i] = in_new_value;
in_new_pixel[in_new_value] += in_pixel[i];
}
for (i = 0; i < MAX_GRAY_LEVEL; i++)
{
out_prob[i] = (double)in_new_pixel[i] / pixel_num;
out_cum_prob[i] = out_prob[i] + (i == 0 ? 0 : out_cum_prob[i - 1]);
out_gray[i] = i;
out_pixel[i] = in_new_pixel[i];
out_sum += i * in_new_pixel[i];
if (in_new_pixel[i] > 0 && i < out_min_gray)
out_min_gray = i;
if (in_new_pixel[i] > 0 && i > out_max_gray)
out_max_gray = i;
}
out_mean = out_sum / pixel_num;
for (i = 0; i < MAX_GRAY_LEVEL; i++)
{
out_std_dev += (i - out_mean) * (i - out_mean) * in_new_pixel[i];
}
out_std_dev = (int)sqrt(out_std_dev / pixel_num);
for (i = 0; i < MAX_GRAY_LEVEL; i++)
{
out_new_value = (int)((MAX_GRAY_LEVEL - 1) * out_cum_prob[i] + 0.5);
if (out_new_value < 0)
out_new_value = 0;
if (out_new_value > MAX_GRAY_LEVEL - 1)
out_new_value = MAX_GRAY_LEVEL - 1;
out_new_gray[i] = out_new_value;
out_new_pixel[out_new_value] += out_pixel[i];
}
for (i = 0; i < pixel_num; i++)
{
gray_level = fgetc(in_file);
fputc(out_new_gray[gray_level], out_file);
}
fclose(in_file);
fclose(out_file);
return 0;
}
```
希望能对你有所帮助!