实验一 直方图均衡化
- 格式:doc
- 大小:210.50 KB
- 文档页数:6
多媒体技术实验报告项目名称: bmp文件直方图均衡
提交文档学生姓名:
提交文档学生学号:
教师评阅成绩:
教师评阅意见:
......................... .........................
1.提交报告时间: 2013年 11月16日
2.实验题目: bmp文件直方图均衡
3.实验要求:
1)读入给定BMP格式图像,
2)求输入图像的直方图, 并以文本文件形式输出
3)完成直方图均衡,
4)将直方图均衡后图像以BMP格式输出
5)计算均衡后图像的直方图, 并以文本文件形式输出
6)观察比较均衡前后图像及直方图的不同
4.实验环境: windows 7 操作系统、vc6.0
5.算法描述:
●程序流程图
●测试程序说明
1.用户需将欲测试文件放在该程序目录下
2.启动程序并输入bmp文件名即可,在该目录下的”resource”文件夹下可以看到运
行后的bmp图像以及在bmp图像均衡前后的直方图输出。
6.源程序清单:
●添加必要的注释
7.运行结果:
测试数据选择
测试结果分析
直方图均衡化前的直方图
直方图均衡化后的脂肪图
8.实验运行情况分析(包括算法、运行结果、运行环境等问题的总体讨论)。
●收获
掌握了bmp文件的一些基本特性以及其存储结构, 此外还掌握了直方图均衡的作用与实现。
●特色
●操作简单, 效果良好
●不足
当测试的bmp图片数据很大时, 可能存在内存溢出的现象。
图像增强实验报告图像增强实验报告引言:图像增强是数字图像处理中的重要技术之一,它可以通过改变图像的亮度、对比度、色彩等参数,使图像更加清晰、细节更加突出。
本实验旨在探究不同图像增强方法对图像质量的影响,并比较它们的效果。
一、实验目的通过实验比较不同的图像增强方法,包括直方图均衡化、拉普拉斯算子增强、灰度变换等,对图像质量的影响,了解各种方法的优缺点,为实际应用提供参考。
二、实验步骤1. 实验准备:准备一组包含不同场景、不同光照条件下的图像样本,以及实验所需的图像处理软件。
2. 直方图均衡化:将图像的直方图进行均衡化,使得图像的像素值分布更加均匀,从而提高图像的对比度和亮度。
3. 拉普拉斯算子增强:使用拉普拉斯算子对图像进行边缘增强,突出图像的细节和纹理。
4. 灰度变换:通过调整图像的灰度级别,改变图像的亮度和对比度,使图像更加清晰明亮。
5. 实验结果分析:对比不同图像增强方法处理后的图像,分析它们在视觉效果上的差异,并根据实验结果评估各种方法的优劣。
三、实验结果与讨论在本次实验中,我们选择了一张室内拍摄的暗淡图像作为样本进行增强处理。
首先,我们对该图像进行了直方图均衡化处理。
结果显示,通过直方图均衡化,图像的亮度和对比度得到了明显的提升,细节也更加清晰可见。
然而,由于直方图均衡化是全局处理,可能会导致图像的局部细节过于突出,从而影响整体视觉效果。
接下来,我们采用了拉普拉斯算子增强方法。
通过对图像进行边缘增强,图像的纹理和细节得到了突出展示。
然而,拉普拉斯算子增强也存在一定的局限性,对于噪声较多的图像,可能会导致边缘增强过程中出现伪影和锯齿现象。
最后,我们尝试了灰度变换方法。
通过调整图像的灰度级别,我们改变了图像的亮度和对比度,使图像的细节更加突出。
与直方图均衡化相比,灰度变换方法更加灵活,可以根据实际需求对图像进行个性化的调整。
综合对比三种图像增强方法的实验结果,我们可以得出以下结论:直方图均衡化适用于对整体亮度和对比度进行提升的场景;拉普拉斯算子增强适用于突出图像的边缘和纹理;灰度变换方法可以根据实际需求对图像进行个性化调整。
数字图像处理实验报告实验名称:直方图均衡化姓名:班级:学号:专业:电子信息工程(2+2)指导教师:陈华华实验日期:2012年5月24日直方图均衡化图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。
直方图均衡化是最常见的间接对比度增强方法。
直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。
直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
缺点:1)变换后图像的灰度级减少,某些细节消失;2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。
这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。
通过这种方法,亮度可以更好地在直方图上分布。
这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
直方图均衡化的基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加了象素灰度值的动态范围从而可达到增强图像整体对比度的效果。
设原始图像在(x,y)处的灰度为f,而改变后的图像为g,则对图像增强的方法可表述为将在(x,y)处的灰度f映射为g。
在灰度直方图均衡化处理中对图像的映射函数可定义为:g = EQ (f),这个映射函数EQ(f)必须满足两个条件(其中L为图像的灰度级数):(1)EQ(f)在0≤f≤L-1范围内是一个单值单增函数。
这是为了保证增强处理没有打乱原始图像的灰度排列次序,原图各灰度级在变换后仍保持从黑到白(或从白到黑)的排列。
(2)对于0≤f≤L-1有0≤g≤L-1,这个条件保证了变换前后灰度值动态范围的一致性。
图像增强—灰度变换及直方图均衡化一、实验目的1、了解图像增强的目的及意义,加深对图像增强的感性认识,巩固所学理论知识。
2、掌握直接灰度变换的图像增强方法。
3、掌握灰度直方图的概念及其计算方法;4、掌握直方图均衡化的计算过程;二、实验原理及知识点1、图像增强是指按特定的需要突出一幅图像中的某些信息,同时,消弱或去除某些不需要的信息的处理方法。
其主要目的是处理后的图像对某些特定的应用比原来的图像更加有效。
图像增强可以在空间域中执行,也可以在变换域中执行。
2、空间域指的是图像平面本身,在空间域内处理图像是直接对图像的像素进行处理。
空间域处理方法分为两种:灰度级变换、空间滤波。
空间域技术直接对像素进行操作,其表达式为g(x,y)=T[f(x,y)]其中f(x,y)为输入图像,g(x,y)为输出图像,T是对图像f进行处理的操作符,定义在点(x,y)的指定邻域内。
定义点(x,y)的空间邻近区域的主要方法是,使用中心位于(x,y)的正方形或长方形区域。
此区域的中心从原点(如左上角)开始逐像素点移动,在移动的同时,该区域会包含不同的邻域。
T应用于每个位置(x,y),以便在该位置得到输出图像g。
在计算(x,y)处的g值时,只使用该领域的像素。
2、灰度变换T的最简单形式是使用领域大小为1×1,此时,(x,y)处的g值仅由f在该点处的亮度决定,T也变为一个灰度变换函数。
由于灰度变换函数仅取决于亮度的值,而与(x,y)无关,所以亮度函数通常可写做如下所示的简单形式:s=T(r)其中,r表示图像f中相应点(x,y)的亮度,s表示图像g中相应点(x,y)的亮度。
灰度拉伸又叫对比度拉伸是最基本的一种灰度变换,使用简单的分段线性变换函数,可以提高灰度的动态范围,适用于低对比度图像的处理,增强对比度。
3、直方图是多种空间城处理技术的基础。
直方图操作能有效地用于图像增强。
除了提供有用的图像统计资料外,直方图固有的信息在其他图像处理应用中也是非常有用的,如图像压缩与分割。
实验一直方图的均衡化一.实验目的1.熟练使用opencv编写程序。
2.熟悉并运用直方图均衡话的方法处理图像。
二.实验原理及代码#include "cv.h"#include "highgui.h"#include "stdio.h"#include "stdlib.h"#include "math.h"#define LEVEL 256int main( int argc, char** argv ){IplImage* pImgSource,*pImgDestination; //声明IplImage指针int height,width,stepSource,stepDestination,channels,grayLevel[LEVEL], pixelsC[LEVEL];uchar *dataSource,*dataDestination;int i,j,k,p;//载入图像pImgSource = cvLoadImage("couple.bmp");if( !pImgSource ){printf("Image was not loaded.\n");return -1;}//获取图像信息height = pImgSource->height;width = pImgSource->width;stepSource = pImgSource->widthStep;channels = pImgSource->nChannels;dataSource = (uchar *)pImgSource->imageData;printf("Processing a %d*%d with %d channels\n",height,width,channels);//获得NO. of pixelsfor(i = 0; i < LEVEL; i++)grayLevel[i] = 0; // 初始化灰度级数组for(i = 0; i < height; i++)for(j = 0; j < width; j++)for(k = 0; k < channels; k++) {p = dataSource[i*stepSource + j*channels + k];grayLevel[p]++;}//均衡化处理pixelsC[0] = grayLevel[0];for(i = 1; i < LEVEL; i++) {pixelsC[i] = grayLevel[i] + pixelsC[i-1];} //pixelsC[]中存储统计量for(i = 0; i < LEVEL; i++)pixelsC[i] = pixelsC[i]*LEVEL/ (height*width*channels) ;//在内存中新建图像数据存储区域,并取得stepDestination参数pImgDestination = cvCreateImage(cvSize(width, height), pImgSource->depth,channels);dataDestination = (uchar*)pImgDestination->imageData;stepDestination = pImgDestination->widthStep;//将源图像处理后的数据添加到新建图像的数据区域for(i = 0; i < height; i++)for(j = 0;j < width; j++)for(k = 0;k < channels; k ++) {p = dataSource[i*stepSource + j*channels + k];dataDestination[i*stepDestination + j*channels + k] =pixelsC[p];}//显示处理前和处理后的图像cvNamedWindow("Image1",1); //创建窗口cvShowImage("Image1",pImgSource); //显示图像cvNamedWindow("Image2",1);cvShowImage("Image2",pImgDestination);cvWaitKey(0);cvDestroyWindow("Image1"); //销毁窗口cvDestroyWindow("Image2");cvReleaseImage(&pImgSource); //释放图像cvReleaseImage(&pImgDestination);return 0;}三.实验结果实验原图均衡化后四.实验心得通过实验我对opencv的上机环境变得更加的熟悉,并对直方图均衡化处理图像和中值滤波也有了一定的理解。
南京信息工程大学实验(实习)报告实验(实习)名称点操作及直方图均衡化实验(实习)日期得分指导教师系计算机系专业软件工程年级三班次 3 姓名学号实验目的:1、理解点操作图像增强方法2、理解直方图均衡化算法的原理,掌握算法的实现实验内容:1、理解图像灰度拉伸,练习imadjust函数的使用;I=imread('pout.tif');K=imadjust(I,[0.2 0.5],[0 1]); figure;subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(K);2、编程实现图像线性灰度变换算法;(全域截取分段 for循环)clear ;clc; I=imread('pout.tif');I=double(I);J=(I-80)*255/70;row=size(I,1);column=size(I,2);for i=1:rowfor j=1:columnif J(i, j)<0J(i,j)=0;endif J(i,j)>255;J(i,j)=255;endendendfigure;subplot(121); imshow(uint8(I)); subplot(122); imshow(uint8(J)); subplot(223),imhist(I);subplot(224),imhist(J);3、编程实现图像二值化算法;直方图选域值clear;clc;i=imread('pout.tif');bw=im2bw(i);subplot(121),imshow(i),subplot(122),imshow(bw);4、编程实现图像灰度对数log变换、指数(三角符号)变换算法;I=imread('pout.tif');J=log(im2double(I)+1);K=fft2(J);n=5;D0=0.1*pi;rh=0.7;rl=0.4;[row, column]=size(J);for i=1:rowfor j=1:columnD1(i,j)=sqrt(i^2+j^2);H(i,j)=rl+(rh/(1+(D0/D1(i,j))^(2*n)));endendL=K.*H;M=ifft2(L); N=exp(M)-1;figure;subplot(121),imshow(I); subplot(122),imshow(real(N));5、在Matlab中编程实现直方图均衡化算法(不使用histeq函数,编程实现其功能)。
昆明理工大学(数字图像处理)实验报告 实验名称: 灰度直方图绘制及直方图均衡化 专 业: 电子信息科学与技术 姓 名: 学 号: 成 绩:[实验目的]1、加强对灰度直方图及直方图均衡化的理解。
2、掌握直方图均衡化方法。
[实验内容]1、编程实现图像的灰度直方图。
2、实现直方图均衡化。
[实验原理]灰度直方图:1、直方图概念:灰度直方图表示图像中每种灰度出现的频率。
2、直方图的作用: 反映一幅图像的灰度分布特性3、直方图的计算: nk 为图像中出现rk 级灰度的像素数,n 是图像像素总数,而 nk/n 即为频数。
直方图均衡化:1、算法思想:通过函数变换,对在图像中像素个数多的灰度 级进行展宽,而对像素个数少的灰度级进行缩减。
从而达 到清晰图像的目的。
2、变换后每一个r 都对应一个s ,变换函数须满足二个条件 :(1)T 单值单增函数。
(2)对 有 则有: [实验步骤]离散情况下的直方图均衡化的算法:1)、列出原始图像的灰度级2)、统计各灰度级的像素数目 10-≤≤L r 1)(0-≤≤L r T 10)(1-≤≤=-L s s T r 1,...2,1,010,)(-=≤≤=l k r Nn r P k k k3)、计算原始图像直方图各灰度级的频数4)、计算累积分布函数5)、计算映射后的输出图像的灰度级。
6)、用的映射关系修改原始图像的灰度级,从而获得直方图近似为均匀分布的输出图像。
创建相应的菜单并建立相应的消息响应函数:添加一个灰度直方图显示框。
调出资源视图窗口,添加ID为IDD_DIALOG4的对话框资源,设计如图:创建对话框类CDialog_ZFT并按下表关联对应变量:资源类型资源ID 关联变量类型图片控件IDC_zft CStatic绘制文本框IDOK intvoid CDialog_ZFT::OnOK(){CWnd *pwnd=GetDlgItem(IDC_zft);CDC *mydc=pwnd->GetDC();for(int i=0;i<count;i++){mydc->MoveTo(i+10,220);mydc->LineTo(i+10,220-data[i]*180/m_fmax);}/**************直方图****************/void CDLView::OnZft(){// TODO: Add your command handler code here if(m_DibHead==NULL){MessageBox("请打开一幅图像");return;}long w,h;w=m_DibHead->biWidth;h=m_DibHead->biHeight;int i ,j;float h1[256],h2[256];float fmax=0.0;for(i=0;i<256;i++)h1[i]=0;for(i=0;i<h;i++){for(j=0;j<w;j++){h1[*(m_Image+i*w+j)]++;}}for(i=0;i<256;i++){h2[i]=h1[i]*1.0/w/h;if(fmax<h2[i])fmax=h2[i];}CDialog_ZFT zft;zft.data=h2;zft.count=256;zft.m_fmax=fmax;zft.DoModal();}/**************直方图均衡化***************/zftjh(unsigned char *lpDib,long lWidth,long lHeight) {unsigned char *lpsrc;long lresult(0);long i,j;unsigned char bMap[256];long lCount[256];for(i=0;i<256;i++)lCount[i]=0;for(i=0;i<lHeight;i++)for(j=0;j<lWidth;j++){lpsrc=lpDib+i*lWidth+j;lCount[*lpsrc]++;}for(i=0;i<256;i++){lresult=0;for(j=0;j<=i;j++)lresult+=lCount[j];bMap[i]=(lresult*255)/lHeight/lWidth;}for(i=0;i<lHeight;i++)for(j=0;j<lWidth;j++){lpsrc=lpDib+i*lWidth+j;*lpsrc=bMap[*lpsrc];}}void CDLView::OnZftjunh(){// TODO: Add your command handler code hereif(m_DibHead->biBitCount!=8){MessageBox("当前版本仅支持256色位图的操作!","系统提示!",MB_ICONINFORMATION|MB_OK);return;}zftjh(m_Image,m_DibHead->biWidth,m_DibHead->biHeight);Invalidate();}[实验结果]原图均衡化后[实验总结]通过对比图像可知,变换后直方图趋向平坦,灰级减少,灰度合并。
实验一直方图均衡化一、实验目的和要求1、实验目的(1)利用MATLAB的软件进行图像处理(2)掌握直方图修改技术进行图像增强(3)掌握MATLAB图像锐化处理2、实验要求(1)掌握课程设计的相关知识,概念清晰。
(2)程序设计合理,能够正确运行。
二、实验内容和原理1、直方图均衡化概念:直方图均衡化就是把一已知灰度概率分布的图像经过一种变换,使之演变成一幅具有均匀灰度概率分布的新图像。
它是以累积分布函数变换法为基础的直方图修正法。
灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数。
直方图操作能够有效用于图像增强;提供有用的图像统计资料,其在软件中易于计算,适用于商用硬件设备。
直方图均衡化是通过对原图像进行某种变换,使原图像的灰度直方图修正为均匀分布的直方图的一种方法。
图像灰度直方图均衡化使得图像的灰度分布趋向均匀,图像所占有的像素灰度间距拉开,加大了图像反差,改善了视觉效果,达到增强目的。
MATLAB是数字图像处理的常用工具,应用MATLAB的各种函数能够对数字图像进行各种处理。
s=kk三、程序设计(1)程序设计思路要实现图像直方图均衡化,根据直方图均衡化的理论基础,首先将原图像的灰度级归一化,将得到的灰度级数记为,计算每个级数灰度值的频率,按灰度值增大累加每个灰度级的频率,得到每个灰度级的累积频率。
输出图像的与原图像的灰度范围一样取个等级,将每个灰度级的累积频率近似为最接近的原图像的灰度值。
这就得到输出图像的每个灰度级灰度值。
根据旧图像灰度值和新灰度图像灰度值的对应关系,计算出对应每个的像素数。
计算出每个的频率,这样就实现了直方图的均衡化。
(2)编写程序编写的源程序代码如下:clc;clear all;close all;I=imread('图片路径\图片名称','图片类型');A=double(I);[m,n]=size(A);c=255;result=0;x=zeros(1,256);y=zeros(1,256);z=zeros(1,256);%计算原图所有灰度级像素数y(k)for i=1:mfor j=1:nt=A(i,j);y(t+1)=y(t+1)+1;endend%原图灰度分布概率z(k)for k=1:256z(k)=y(k)/(m*n);end%计算累计概率x(l)for l=1:256result=result+z(l);x(l)=result;end%累计概率取整x=round(c*x);%将处理后的灰度装入新的矩阵for i1=1:mfor j1=1:nM(i1,j1)=x(A(i1,j1)+1);endend%转换为unit8型P=uint8(M);%输出均衡化前后图像和直方图subplot(2,2,1);imshow(I);title('原始图像');subplot(2,2,2);imhist(I);title('原始直方图');subplot(2,2,3);imshow(P);title('均衡化图像');subplot(2,2,4);imhist(P);title('直方图均衡化');(3)运行程序在MATLAB的编辑器中输入程序,保存。
编程实现直方图均衡化一、实验目的掌握直方图均衡化的原理,和其步骤,了解直方图均衡化的作用、效果。
二、实验要求实现对任意图像进行直方图均衡化。
三、实验原理1.直方图均衡化:对原始图像的像素灰度做某种映射变换,使变换后图像直方图的概率密度呈均匀分布,即变换后图像的灰度级均匀分布。
2. 步骤:(1).统计原图像每一灰度级的像素数和累积像素数。
(2).计算每一灰度级xa均衡化后对应的新值,并对其四舍五入取整,得到新灰度级xb。
(3).以新值替代原灰度值,形成均衡化后的新图像。
(4).根据原图像像素统计值对应找到新图像像素统计值,作出新直方图。
四、实验思路五、 实验步骤1.新建项目文件:本实验选用的语言是C#,开发工具是VisualStudio2010,通过“文件—新建—项目—C#—Windows 窗体应用程序”,命名“直方图均衡化”即可;2.编写代码:由实验思路中的思维导图可得知,本实验步骤与“绘制直方图实验非常类似”,只是中间加了对原始图像灰度值统计数据进行了均衡化处理这一步骤,因此,只需在它的基础上进行改动和添加部分代码即可,具体如下:(1).编写头文件读取代码:由于以前的实验已有该代码,那么只需,导入其所在的“.cs ”类文件即可;(2).编写读取图像灰度值代码:将“绘制任意图像灰度值”实验该部分功能“.cs ”类文件导入即可;(3).编写统计灰度值代码:载入该功能所在“.cs ”类文件即可;(4).编写直方图均衡化代码:由实验原理里的直方图均衡化步骤可知它对应的代码部分应该有:统计像素累计数,这个只需利用已有的灰度值及其频数所在的Hashtable 哈希表数据即可;将原始灰度级映射到新的值,只需编写一个 对应方法,再对新的灰度级频数进行统计即可,具体代码将后文;(5).编写绘制直方图代码:导入已有的代码所在“.cs ”类文件即可。
3.编译与调试:通过VS2010断点等调试工具,可查看、排除程序错误,无语法、逻辑错误后,编译生成程序文件即可;4.运行程序查看结果:运行程序,加载实验数据,查看绘制出的直方图,然后再通过ENVI 的“Enhance-Interactive Stretching ”工具选择“SretchType ”为“Equalization ”执行后显示的直方图对比,看是否准确;六、 结果与分析1. 结果程序界面()01kja a j L h x N =-∑2.分析在对灰度级进行映射转换时一定要进行四舍五入运算,否则会有误差。
课程设计课程名称数字图像处理题目名称直方图均衡化学生学院信息工程学院专业班级 10级电信2班学号学生姓名指导教师曹江中2013年 1 月日设计题目:直方图均衡化1、直方图的理论基础:(1)直方图概念:灰度直方图表示图像中每种灰度出现的频率。
(2)直方图的作用: 反映一幅图像的灰度分布特性(3)直方图的计算: 式中:n k 为图像中出现r k 级灰度的像素数,n 是图像像素总数,而n k /n 即为频数。
2、设计目的: 产生一幅灰度级分布具有均匀概率密度的图像,扩展像素取值的动态范围,达到了图象增强的目的。
3、直方图均衡化的效果 :1)变换后直方图趋向平坦,灰级减少,灰度合并。
2)原始象含有象素数多的几个灰级间隔被拉大了,压缩的只是象素数少的几个灰度级,实际视觉能够接收的信息量大大地增强了,增加了图象的反差。
同时,也增加了图象的可视粒度。
4、离散情况下的直方图均衡化的算法:A 、列出原始图像的灰度级B 、统计各灰度级的像素数目C 、计算原始图像直方图各灰度级的频数D 、计算累积分布函数F 、应用以下公式计算映射后的输出图像的灰度级,P 为输出图像灰度级的个数,其中INT 为取整符号:G 、用的映射关系修改原始图像的灰度级,从而获得直方图近似为均匀分布的输出图像。
5、主要代码///////////////////////////////////////////////////////////////////画两个直方图坐标轴/////////////////////////////////////////////////////////////////// void CImageView::OnDraw(CDC* pDC){1,,1,0,-=L j f j 1,,1,0,-=L j n j 1,,1,0,/)(-==L j n n f P j j f 1,,,1,0,)()(0-==∑=L k j f P f C k j j f ]5.0)()[(min min max ++-=g f C g g INT g i nn r p k k =)(1,,2,1,010-=≤≤l k r kCImageDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereif(m_dib.m_bLoaded==true) //判断是否加载图像{//获取图像宽和高int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight(); ASSERT_VALID(pDoc);// TODO: add draw code for native data hereif(m_dib.m_bLoaded==true){int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();m_dib.ShowDIB(pDC,10,10,nw,nh,m_dib.m_pDIBData,m_dib.m_pBMI);m_dib.ShowDIB(pDC,400,10,nw,nh,m_dib.m_pDumpDIBData,m_dib.m_pBMI) ;}if(m_bHist==true){//绘画直方图CString str;int nh=m_dib.GetDIBHeight();int i;// 绘制坐标轴pDC->MoveTo(10,nh+20); //(10,nh+20 )是直方图的左上角坐标// 垂直轴pDC->LineTo(10,nh+200);//(10,nh+200 )是直方图的左下角坐标// 水平轴pDC->LineTo(310,nh+200);//(310,nh+200 )是直方图的右下角坐标// 写X轴刻度值str.Format("0");pDC->TextOut(10, nh+200+10, str);str.Format("50");pDC->TextOut(60, nh+200+10, str);str.Format("100");pDC->TextOut(110, nh+200+10, str);str.Format("150");pDC->TextOut(160, nh+200+10, str);str.Format("200");pDC->TextOut(210, nh+200+10, str);str.Format("255");pDC->TextOut(265, nh+200+10, str);str.Format("原图直方图归一化");pDC->TextOut(100, nh+230+10, str);// 绘制X轴刻度for ( i = 0; i < 256; i += 25){if ((i & 1) == 0){// 10的倍数pDC->MoveTo(i + 10, nh+200-2);pDC->LineTo(i + 10, nh+200+2);}else{// 10的倍数pDC->MoveTo(i + 10, nh+200-2);pDC->LineTo(i + 10, nh+200+2);}}// 绘制X轴箭头pDC->MoveTo(305,nh+200-5);pDC->LineTo(310,nh+200);pDC->LineTo(305,nh+200+5);// 绘制y轴箭头pDC->MoveTo(10,nh+20);pDC->LineTo(5,nh+20+5);pDC->MoveTo(10,nh+20);pDC->LineTo(15,nh+20+5);int max=0;for(i=0;i<256;i++)if(m_yuantu[i]>max)max=m_yuantu[i];for(i=0;i<256;i++){pDC->MoveTo(10+i,nh+200);pDC->LineTo(10+i,nh+200-(m_yuantu[i]*160/max));}}/******************///TEST 第二个直方图if(m_bHist==true){//绘画直方图CString str;int nh=m_dib.GetDIBHeight();int i;// 绘制坐标轴pDC->MoveTo(160+nw,nh+20); //(10,nh+20 )是直方图的左上角坐标// 垂直轴pDC->LineTo(160+nw,nh+200);//(10,nh+200 )是直方图的左下角坐标// 水平轴pDC->LineTo(460+nw,nh+200);//(310,nh+200 )是直方图的右下角坐标// 写X轴刻度值str.Format("0");pDC->TextOut(415, nh+200+10, str);str.Format("50");pDC->TextOut(465, nh+200+10, str);str.Format("100");pDC->TextOut(515, nh+200+10, str);str.Format("150");pDC->TextOut(565, nh+200+10, str);str.Format("200");pDC->TextOut(615, nh+200+10, str);str.Format("255");pDC->TextOut(670, nh+200+10, str);str.Format("直方图均衡化后归一化");pDC->TextOut(505, nh+230+10, str);// 绘制X轴刻度for ( i = 0; i < 256; i += 25){if ((i & 1) == 0){// 10的倍数pDC->MoveTo(i + 420, nh+200-2);pDC->LineTo(i + 415, nh+200+2);}else{// 10的倍数pDC->MoveTo(i + 420, nh+200-2);pDC->LineTo(i + 420, nh+200+2);}}// 绘制X轴箭头pDC->MoveTo(710,nh+200-5);pDC->LineTo(715,nh+200);pDC->LineTo(710,nh+200+5);// 绘制y轴箭头pDC->MoveTo(415,nh+20);pDC->LineTo(410,nh+20+5);pDC->MoveTo(415,nh+20);pDC->LineTo(420,nh+20+5);int max=0;for(i=0;i<256;i++)if(m_hist[i]>max)max=m_hist[i];for(i=0;i<256;i++){pDC->MoveTo(415+i,nh+200);pDC->LineTo(415+i,nh+200-(m_hist[i]*160/max));}}/*************/// 显示图像(具体的参数见CDIB类的该函数说明)m_dib.ShowDIB(pDC,10,10,nw,nh,m_dib.m_pDIBData,m_dib.m_pBMI);m_dib.ShowDIB(pDC,400,10,nw,nh,m_dib.m_pDumpDIBData,m_dib.m_pBMI);}}/////////////////////////////////////////////////////////////////////直方图均衡化及直方图归一化坐标轴赋值程序///////////////////////////////////////////////////////////////////// void CImageView::OnZhifangtu(){//判断图像是否打开,没打开,则弹出提示框并退出函数if(!m_dib.m_bLoaded){AfxMessageBox("图像还打开,请先打开图像!");return;}//获取图像宽和高及定义成员变量int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();int i,j;int *arr=new int [nw*nh];int n[256]={0};float p[256]={0.0},c[256]={0.0};BYTE* pdata=m_dib.m_pdata;for(i=0;i<256;i++) //初始化直方图数组m_yuantu[i]=0;if(1)//m_dib.m_nImType==24){for(j=0;j<nh;j++)for(i=0;i<nw;i++){BYTE temp=pdata[j*nw+i];m_yuantu[temp]++;}}m_bHist=true;//直方图归一化计算for(i=0;i<nh;i++){for(j=0;j<nw;j++){n[m_dib.m_pdata[i*nw+j]]++;}}for(i=0;i<256;i++){(float)p[i]=(float)n[i]/(float)(nw*nh); }//归一化后累计计算for(i=0;i<256;i++){for(j=0;j<=i;j++){c[i]+=p[j];}}//找到灰度值最大值最小值int max=m_dib.m_pdata[0],min=m_dib.m_pdata[0]; for(i=0;i<nh;i++){for(j=0;j<nw;j++){if(max<m_dib.m_pdata[i*nw+j]){max=m_dib.m_pdata[i*nw+j];}else if(min>m_dib.m_pdata[i*nw+j]){min=m_dib.m_pdata[i*nw+j];}}}//套公式直方图均衡化计算赋值给arr[]一维数组for(i=0;i<nh;i++){for(j=0;j<nw;j++){arr[i*nw+j]=int(c[m_dib.m_pdata[i*nw+j]]*(max-min)+min+0.5); }}//一维数组arr[]赋值给新图像for( j=0;j<nh;j++){for(i=0;i<nw;i++){m_dib.m_pdata[j*nw+i]=arr[j*nw+i];}}//将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果m_dib.UpdateData();//刷新屏幕Invalidate();for(i=0;i<256;i++) //初始化直方图数组m_hist[i]=0;if(1)//m_dib.m_nImType==24){for(j=0;j<nh;j++)for(i=0;i<nw;i++){BYTE temp=pdata[j*nw+i];m_hist[temp]++;}}m_bHist=true;// TODO: Add your command handler code here}6、实验结果。
湖南科技大学
电子与电气技术实验中心
实验报告
实验课程:数字图像处理
试验项目:直方图均衡化
实验内容:直方图均衡化
院系:信息与电气工程学院
专业:通信工程
班级:一班
姓名:卢泽
学号: 1204040107
实验日期: 2015.05.07 实验室名称:信号与系统实验室
1.实验目的
熟悉数字图像直方图灰度变换的方法。
2.实验设备与环境
1)PC机一台;
2)MATLAB软件。
3.实验原理
3.1直方图
直方图就是指图像中各像素的统计值,反映图象中每种灰度出现的频率。
直方图的性质:
1)表征了图像的一维信息。
只反映图像中像素不同灰度值出现的次数(或频数)而未反映像素所在位置。
2)与图像之间的关系是多对一的映射关系。
一幅图像唯一确定出与之对应的直方图,但不同图像可能有相同的直方图。
3)子图直方图之和为整图的直方图。
3.2直方图均衡化
直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
直方图均衡化过程:
1)列出原始图像和变换后图像的灰度级(L是灰度级的个数);
2)统计员图像中各灰度级的像素个数;
3)计算原始图像直方图P(i)=Ni/N;
4)计算累计直方图P(j)=P(1) + P(2) + P(3) +…+ P(i);
5)利用灰度值变换函数计算变换后的灰度值,兵四舍五入取整;j=INT[(L-1)Pj+0.5]
6)确定灰度变换关系i→j,据此将原图像的灰度值f(m,n)=i修正为g(m,n)=j;
7)统计变换后个灰度级的像素个数Nj;
8)计算变换后图像的直方图Pj=Nj/N。
4.实验内容与步骤
4.1实验内容
练习图像预处理的Matlab命令,熟悉下列函数:
imread
imshow
figure
plot
subplot
histeq
imadjust
4.2实验步骤
a.从硬盘中载入“cameraman.tif”图像(使用imread函数);
b.在窗口显示图片;
c.显示图像的直方图(使用imhist函数);
d.利用直方图均衡化函数增强图像对比度;
e.在处理之后显示直方图图片;
f.比较两幅图片的质量并讨论。
5.实验数据
5.1调整图像对比度
图 1 原始图像和对比度调整后的图像
图 2 对比度调整后的图像的直方图
5.2直方图均衡化
图 3 原始图像及其直方图均衡化后的图像
图 4 直方图均衡化前后的图像及其灰度直方图
6.实验总结
通过本次实验,我熟悉了MATLAB软件,运用该软件来进行数字图像处理,熟悉数字图像直方图灰度变换的方法,独立编写程序,仿真调试,比较并分析直方图均衡化后的图片与原始图片。
7.程序
1.调整图像的对比度
I=imread('tire.tif');
J=imadjust(I,[0.3 0.7],[]);
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(J);
figure(1),subplot(1,2,1),imhist(I);
figure(2),subplot(1,2,2),imhist(J);
2.直方图均衡化
I=imread('tire.tif');
J=histeq(I);
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(J);
figure(1),subplot(1,2,1),imshow(I,64);
figure(2),subplot(1,2,2),imshow(J,64);
figure(3),imhist(I);
figure(4),imhist(J);
(注:文档可能无法思考全面,请浏览后下载,供参考。
可复制、编制,期待你的好评与关注)。