C语言实现BMP图像直方图均衡化
#include <stdio.h> #include <stdlib.h>
#pragma pack(2) typedef struct { short bfType; int bfSize; short bfReserved1; short bfReserved2; int bfOffBits; } BITMAPFILEHEADER;
typedef struct { int biSize; int biWidth; int biHeight; short biPlanes; short biBitCount; int biCompression; int biSizeImage; int biXPelsPerMeter; int biYPelsPerMeter; int biClrUsed; int biClrImportant; } BITMAPINFOHEADER;
typedef struct { unsigned char b; unsigned char g; unsigned char r; } RGB;
int main() { FILE *fp_in = fopen('3.bmp', 'rb'); if (fp_in == NULL) { printf('open file failed!\n'); return 0; }
BITMAPFILEHEADER file_header;
BITMAPINFOHEADER info_header;
fread(&file_header, sizeof(BITMAPFILEHEADER), 1, fp_in);
fread(&info_header, sizeof(BITMAPINFOHEADER), 1, fp_in);
int width = info_header.biWidth;
int height = info_header.biHeight;
int line_byte = (width * 24 + 31) / 32 * 4;
RGB **data = (RGB**)malloc(sizeof(RGB*) * height);
for (int i = 0; i < height; i++) {
data[i] = (RGB*)malloc(sizeof(RGB) * width);
fread(data[i], sizeof(RGB), width, fp_in);
fseek(fp_in, line_byte - width * sizeof(RGB), SEEK_CUR);
}
fclose(fp_in);
// 直方图均衡
int histogram[256] = {0};
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
histogram[data[i][j].g]++;
}
}
int equalization[256] = {0};
int sum = 0;
for (int i = 0; i < 256; i++) {
sum += histogram[i];
equalization[i] = sum * 255 / (width * height);
}
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
data[i][j].g = equalization[data[i][j].g];
}
}
// 写入文件
FILE *fp_out = fopen('5.bmp', 'wb');
if (fp_out == NULL) {
printf('create file failed!\n');
return 0;
}
fwrite(&file_header, sizeof(BITMAPFILEHEADER), 1, fp_out);
fwrite(&info_header, sizeof(BITMAPINFOHEADER), 1, fp_out);
for (int i = 0; i < height; i++) {
fwrite(data[i], sizeof(RGB), width, fp_out);
fwrite('\0\0\0\0', 1, line_byte - width * sizeof(RGB), fp_out);
}
fclose(fp_out);
for (int i = 0; i < height; i++) {
free(data[i]);
}
free(data);
return 0;
}
原文地址: https://www.cveoy.top/t/topic/jCXA 著作权归作者所有。请勿转载和采集!