搜索
您的当前位置:首页正文

数字图像处理_直方图均衡化

来源:意榕旅游网


东华大学实验报告

课程 数字图像处理 名称 数字图像变换

实验名称:直方图均衡化

一、 实验目的

图像变换是数字图像处理中的一种综合变换,如直方图变换、几何变换等。通过本实验,使得学生掌握两种变换的程序实现方法。

二、 实验任务

使用C语言对位图文件的头信息进行读取,从而对图像进行直方图均衡化处理和灰度变换。 三、实验环境

本实验在Windows平台上进行,对内存及cpu主频无特别要求,使用VC或者MINGW(gcc)编译器均可。

四、设计思路

介绍代码的框架结构、所用的数据结构、各个类的介绍(类的功能、类中方法的功能、类的成员变量的作用)、各方法间的关系

试验要求中以给出大致的编程思路和源代码以及代码注释,只有黑框部分需要自己填写。在此不进行赘述。

五、具体实现

实现设计思路中定义的所有的数据类型,对每个操作给出实际算法。对主程序和其他模块也都需要写出实际算法。

注意:源代码中要加上注释。

代码:(红色为填入代码)

/*------利用第一次实验课提供的 dhc.h 和 dhc.c文件以获取位图的高 宽 以及从文件头到实际的位图数据的偏移字节数,从而实现对位图实际数据的操作。------*/

#include

#include

#include

#include \"hdr.h\"

/*------定义结构指针------*/

struct bmphdr *hdr;

//定义用于直方图变量

unsigned char *bitmap, new_color[256];

//定义计算灰度分布,灰度累计分布的数组

int count[256], acum[256];

/*------main()函数编写------*/

int main()

{

//定义整数 i, j 用于函数循环时的,nr_pixels为图像中像素的个数

int i, j, nr_pixels;

//定义两个文件指针分别用于提取原图像的数据和生成直方图均衡化后的图像

FILE *fp, *fpnew;

//定义主函数的参数包括:输入的位图文件名和输出的位图文件名,此处内容可以不要,在DOS下执行命令的时候再临时输入也可,为了方便演示,我这里直接把函数的参数确定了。

// argc=3;

// argv[1]=\"test.bmp\";

// argv[2]=\"testzf.bmp\";

//参数输入出错显示

/* if (argc != 3) {

printf(\"please input the name of input and out bitmap files\\n\");

exit(1);

}*/

// 获取位图文件相关信息

// hdr = get_header(argv[1]);

hdr = get_header(\"test.bmp\");

if (!hdr) exit(1);

//以二进制可读方式打开输入位图文件

fp = fopen(\"test.bmp\

if (!fp) {

printf(\"File open error!\\n\");

exit(1);

}

// 文件指针指向数据区域

fseek(fp, hdr->offset, SEEK_SET);

//计算位图像素的个数

nr_pixels = hdr->width * hdr->height;

bitmap = malloc(nr_pixels);

//读取位图数据到bitmap中

fread(bitmap, nr_pixels, 1, fp);

fclose(fp);

memset(count, 0, sizeof(count));

//计算每个灰度级上像素的个数 结果存入count[]数组中

for(i=0;i{

count[bitmap[i]]++;

}

memcpy(acum, count, sizeof(acum));

//计算灰度的累计分布

for (i = 1; i < 256; i++)

acum[i] += acum[i-1];

//灰度直方图的均衡化(核心程序部分,请仔细分析)为了方便大家编程实现,这里直接给出了源代码,本实验最核心的部分就在这里

for (i = 0; i < 256; i++) {

new_color[i]=acum[i]*255/acum[255];

//定义新的灰度对应规则 new_color[i]; 其中 0<=i<=255

}

//对所有的像素灰度值按照均衡化得到的灰度对应规则进行转换,结果存入bitmap[]中

for (i = 0; i < nr_pixels; i++)

bitmap[i]=new_color[bitmap[i]];

// 打开一个以输出文件名命名的文件,设为可写的二进制形式

fpnew = fopen(\"testzf.bmp\

//由于位图文件的头部信息并没有因直方图均衡化而改变,因此输出图像的头部信息从原位图文件中拷贝即可:

fwrite(hdr->signature, 2, 1, fpnew);

fwrite(&hdr->size, 4, 1, fpnew);

fwrite(hdr->reserved, 4, 1, fpnew);

fwrite(&hdr->offset, 4, 1, fpnew);

fwrite(&hdr->hdr_size, 4, 1, fpnew);

fwrite(&hdr->width, 4, 1, fpnew);

fwrite(&hdr->height, 4, 1, fpnew);

fwrite(&hdr->nr_planes, 2, 1, fpnew);

fwrite(&hdr->bits_per_pixel, 2, 1, fpnew);

fwrite(&hdr->compress_type, 4, 1, fpnew);

fwrite(&hdr->data_size, 4, 1, fpnew);

fwrite(&hdr->resol_hori, 4, 1, fpnew);

fwrite(&hdr->resol_vert, 4, 1, fpnew);

fwrite(&hdr->nr_colors, 4, 1, fpnew);

fwrite(&hdr->important_color, 4, 1, fpnew);

if (hdr->offset > 54)

fwrite(hdr->info, (hdr->offset - 54), 1, fpnew);

//直方图均衡化的数据(bitmap)赋值

fwrite(bitmap, nr_pixels, 1, fpnew);

//关闭

fclose(fpnew);

//释放内存(优化程序必需)

free(hdr);

free(bitmap);

return 0;

}

六、心得体会

给出的代码有所改动,不然编译无法通过。

本次实验形象的让我们看到直方图均衡化的效果,其实质就是通过减少图象的灰度级以换取对比度的加大。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top