直方图均衡实验报告
直方图均衡化实验报告
多媒体技术实验报告项目名称: 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. 使用IPT中imhist,histeq函数进行直方图的均衡化和规定化,并显示结果2. 编写myhisteq函数实现直方图均衡化,与1中结果进行对比3. 给读取的图像叠加椒盐噪音(imnoise),分别使用均值滤波和中值滤波进行去噪,并对比图像处理的结果(使用IPT函数)4. 自定义3*3模板矩阵F,编写myfilter函数实现模板和图像的卷积运算,设计模板矩阵,实现图像的平滑和锐化。
三、实验代码及结果(1) 直方图的均衡化和规定化clc;clear;I= imread('H:\image\jpg\flower.jpg');I= rgb2gray(I) ; %将图像转换为灰度图像J= histeq( I) ; %对I 进行直方图均衡化figure,subplot( 2,2,1) ,imshow(I) ,title('原始图像') ;subplot (2,2,2), imshow(J), title('直方图均衡化后的图像');subplot( 2,2,3) ,imhist(I, 64), title( '原始的直方图');subplot( 2,2,4) ,imhist(J,64) ,title(' 均衡化后的直方图');clc;clear;I= imread('H:\image\jpg\flower.jpg');I= rgb2gray(I) ; %将图像转换为灰度图像h=0:255;h=1-h/255;J= histeq( I,h) ;figure,subplot( 2,3,1) ,imshow(I) ,title('原图像') ; subplot( 2,3,2) ,imhist(I, 64), title( '原图像的直方图'); subplot (2,3,3), stem(h), title('目标直方图');subplot( 2,3,4) ,imshow(I, 64), title( '规定化后的图像'); subplot( 2,3,5) ,imhist(J,64) ,title(' 规定化后的直方图');二、myhisteq函数实现直方图均衡化I = imread('j:\image\jpg\flower.jpg');I = rgb2gray(I);[height,width] = size(I);figuresubplot(2,2,1)imshow(I)%显示原始图像title('原图像');subplot(2,2,2)imhist(I)%显示原始图像直方图title('原图像直方图');%进行像素灰度统计;s = zeros(1,256);%统计各灰度数目,共256个灰度级for i = 1:heightfor j = 1: widths(I(i,j) + 1) = s(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一endend%计算灰度分布密度p = zeros(1,256);for i = 1:256p(i) = s(i) / (height * width * 1.0);end%计算累计直方图分布c = zeros(1,256);c(1) = p(1);for i = 2:256c(i) = c(i - 1) + p(i);end%累计分布取整,将其数值归一化为1~256c = uint8(255 .* c + 0.5);%对图像进行均衡化for i = 1:heightfor j = 1: widthI(i,j) = c(I(i,j)+1);endendsubplot(2,2,3)imshow(I)%显示均衡化后的图像title('均衡化后图像');subplot(2,2,4)imhist(I)%显显示均衡化后的图像的直方图title('均衡化后图像的直方图');三、使用均值滤波和中值滤波进行去噪I= imread('j:\image\jpg\flower.jpg');I= rgb2gray(I) ; %将图像转换为灰度图像I1 = imnoise(I,'salt & pepper',0.02);%0.02是噪声强度,其值越大噪声越多h=fspecial('average',5);J1=filter2(h,I1,'valid');J2= imfilter(I1,h,'full');figure,subplot(3,3,1),imshow(I1);title('原始椒盐噪声图像图1');subplot(3,3,2),imshow(uint8(J1));title('filter2均值滤波图2');subplot(3,3,3),imshow(J2);title('imfilter均值滤波图3');J3 = medfilt2(I1,[5,5]);subplot(3,3,4),imshow(J3),title('中值滤波效果图4');G1= histeq(I1);subplot(3,3,5),imhist(G1,64),title('原图均衡化后的直方图');G2= histeq(J1);subplot(3,3,6),imhist(uint8(G2),64),title('图2均衡化后直方图'); G3= histeq(J2);subplot(3,3,7),imhist(G3,64),title('图3均衡化后直方图');G4= histeq(J3);subplot(3,3,8),imhist(G4,64),title('图4均衡化后直方图');问题:对于filter2均值滤波均衡化直方图不显示,不知道原因。
数字图像处理实验报告直方图均衡化
数字图像处理实验报告实验名称:直方图均衡化姓名:班级:学号:专业:电子信息工程(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,这个条件保证了变换前后灰度值动态范围的一致性。
直方图均衡化实验报告
医学图像处理实验报告实验名称:直方图均衡化实验姓名:gao jun qiang 学号:20105405班级:生医1001指导教师:……2013年6月5日一、 实验目的1、编程实现下列功能:读出存储的黑白灰度图象并显示,显示灰度直方图,对图象进行直方图均衡化处理,显示处理后图象及直方图,画出灰度变换曲线,并存储处理后图象。
二、 实验原理直方图均衡化处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
直方图均衡化是一种自动调节图象对比度质量的算法,使用的方法是灰度级变换:s = T(r) 。
它的基本思想是通过灰度级r 的概率密度函数p(rk ),求出灰度级变换T(r).灰度直方图的计算十分简单,依据定义在离散形式下有下面的公式成立:()1,1,0,-==L k n n k p k Λ (1) 公式中:k n 为图像中出现k s 级灰度的像素数,n 是图像像素总数,而n nk 即为频数。
计算累积直方图各项:()1,1,0,00-===∑∑==L k i p n n t k i ki i k Λ (2) 取整扩展:]5.0)1int[(+-=k k t L t (3)映射对应关系 :k t k ⇒三、实验代码及结果直方图均衡化实验代码:clc;close all;clear all;Imag = imread('lena.tiff');figure()imshow(Imag),title('原图像');ImagGray = rgb2gray(Imag);figure()imshow(ImagGray),title('灰度图像');[r,c] = size(ImagGray);%统计灰度直方图GrayPixNum = zeros(1,255);for i = 1:rfor j = 1:cGrayPixNum(1,ImagGray(i,j)) = GrayPixNum(1,ImagGray(i,j))+1;endend%对灰度直方图进行归一化GrayPixPro = GrayPixNum./(r*c);figure()plot(GrayPixPro),title('图像直方图');%-----------------------------------------------------------% -----------------------直方图均衡化------------------------%-----------------------------------------------------------%直方图累加GrayAdd = zeros(1,255);GrayAdd(1,1) = GrayPixPro(1,1);for i = 2:255GrayAdd(1,i) = GrayAdd(1,i-1)+GrayPixPro(1,i);endNewGray = round(GrayAdd.*254.+0.5);NewGrayPro = zeros(1,255);for i = 1:255GrayTemp = NewGray(1,i);NewGrayPro(1,GrayTemp) = NewGrayPro(1,GrayTemp)+GrayPixPro(1,i); endfigure()plot(NewGrayPro.*(r*c)),title('均衡化直方图');%有均衡化直方图和映射关系得到均衡化的图像NewImag = zeros(r,c);for i =1:rfor j = 1:cNewImag(i,j) = NewGray(1,ImagGray(i,j));endendNewImag = uint8(NewImag);figure()imshow(NewImag),title('均衡化的图像');figure()plot(NewGray),title('灰度变换曲线');实验结果:图1 原灰度图像图2 原图像的灰度直方图图3 经过直方图均衡化后的灰度图片图4 均衡化后的直方图图5 灰度变化曲线三、实验思考从上述实验结果可以看出,经过直方图均衡化后的图片的对比度更高,且边缘效果更高。
直方图均衡化实验报告
南京信息工程大学实验(实习)报告实验(实习)名称点操作及直方图均衡化实验(实习)日期得分指导教师系计算机系专业软件工程年级三班次 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函数,编程实现其功能)。
直方图均衡化和匹配报告
直方图均衡化和匹配报告一.实验目的:加强直方图均衡化和直方图匹配的图像增强技术的认识和了解; 学会用Matlab 中的下列函数对输入图像进行上述2类运算; 感受各种不同的直方图图像增强处理方法对最终图像效果的影响; 二.实验内容:1.熟悉Matlab 文件中有关Imhist 和histeq 函数的使用说明,充分理解其使用方法并能运用它们完成实验内容。
2.将mountain.jpg 图像文件读入Matlab ,对其作直方图均衡化。
显示运算前后该图像的直方图,处理后的图像。
3.对mountain.jpg 图像做直方图匹配运算,显示运算前后该图像的直方图,处理后的图像和灰度变换函数。
直方图反映灰度等级的分布情况,本实验指定的直方图如下:1400×rr ≤5 7000-310×r 5<r ≤20 900-5×r 20<r ≤180 -1440+8×r 180<r ≤225 3060-12×r225<r ≤2554.利用mountain.jpg 图像的直方图(imhist 函数可生成),编写直方图均衡化函数,显示灰度变换函数。
三.实验结果与分析:1.图像均衡化处理前后的直方图和图像对比原图像 均衡化后的图像n =原图像直方图均衡化后的直方图由处理后的图像可以看出,图像的灰度值减少,图像对比度明显增强,但是导致很多地方的细节模糊,看不清楚;而且有些地方过分增强,严重干扰清晰度。
2.直方图匹配处理前后图像对比原图像处理后图像原图像直方图直方图匹配运算后的直方图直方图匹配运算函数采用直方图匹配运算后,发现效果明显比直接均衡化的效果好的多,将一些重要的细节突出来了,对比度明显增强,但是有些地方色彩过于暗淡,灰度值过高,影响了图像的美观,但用于进行图像对比分析还是比较实用的。
3.编写的直方图均衡化函数,进行灰度变换原图处理后图像原图直方图处理后直方图最后一步通过自己编写的程序,对直方图进行均衡化,效果与第一步所取得的效果差不多是一致的。
统计图像直方图及图像均衡化
数字图像处理实验报告一、实验内容:1、统计图像直方图2、直方图的均衡化二、实验目的:1、学会在VC环境下使用opencv,能学会基本的图像导入与显示2、学会加载图像及图像各像素点的统计3、理解并掌握利用直方图均衡化图像的过程,并用程序加以实现三、实验代码:#include "cv.h"#include "highgui.h"#include<stdio.h>#include<math.h>int main( int argc, char** argv ){IplImage* plmg; //声明IplImage指针int height,width,step,channels;uchar *data;int i,j,k,r,count=0;int r0[256]={0};float pr[256]={0},sk[256]={0};//载入图像plmg = cvLoadImage("Tulips.jpg", 1);{cvNamedWindow( "Image", 1 );//创建窗口cvShowImage( "Image", plmg );//显示图像//统计图像各参数并赋值height=plmg->height;width=plmg->width;step=plmg->widthStep;channels=plmg->nChannels;data=(uchar *)plmg->imageData;printf("Processing a %d*%d with %d channels\n",height,width,channels);//反转图像/* for(i=0;i<height;i++)for(j=0;j<width;j++)for(k=0;k<channels;k++)data[i*step+j*channels+k]=255-data[i*step+j*channels+k];cvNamedWindow( "Image1", 1 );//创建窗口cvShowImage( "Image1", plmg );//显示图像*/for(i=0;i<height;i++) //统计直方图for(j=0;j<width;j++)for(k=0;k<channels;k++)//for(r=0;r<256;r++)r0[data[i*step+j*channels+k]]++;for(r=0;r<256;r++)count=count+r0[r];for(r=0;r<256;r++)printf("pixel %d is %d\n",r,r0[r]);printf("all pixels=%d\n",count);for(r=0;r<256;r++){pr[r]=r0[r]/(float)count; //像素点归一化printf("pixel %d 的个数及归一化:%d %f\n",r,r0[r],pr[r]);}sk[0]=255*pr[0]; //均衡化像素函数for(r=1;r<256;r++)sk[r]=sk[r-1]+pr[r]*255;for(r=0;r<256;r++){printf("pixel %d befor equilibria is %d ,after is %f \n",r,r0[r],sk[r]);}//映射到原图像,即像素值强制修改为均衡后的值for(i=0;i<height;i++)for(j=0;j<width;j++)for(k=0;k<channels;k++)data[i*step+j*channels+k]=sk[data[i*step+j*channels+k]];cvNamedWindow( "Image1", 1 );//创建窗口cvShowImage( "Image1", plmg );//显示图像*/cvWaitKey(0); //等待按键cvDestroyWindow( "Image" );//销毁窗口cvReleaseImage( &plmg ); //释放图像return 0;}return -1;}四、实验结果:五、实验心得:1、每建立一个将要使用opencv的VC Project ,都需要给它指定需要的lib文件2、需要加载的图像必须和所建工程的程序文件在同一个目录下3、对图像操作时,必须先把定义的图像参数赋值,否则将不能对图像进行修改4、初步掌握了opencv在VC环境下的运行与基本的opencv语句5、图像均衡化时,要注意归一时是除以所有像素点的总数,均衡时概率依次累加后乘以的是最大灰度级,同时要注意所用数组整型和浮点型的转换6、实验误区:各灰度级经过像素点的计算得到均衡化的结果是灰度数,而不再是像素点的个数7、数组赋值需用{}。
实验报告
实验一直方图均衡化一、实验目的和要求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的编辑器中输入程序,保存。
数字图像处理实验报告 直方图均衡化
课程设计课程名称数字图像处理题目名称直方图均衡化学生学院信息工程学院专业班级 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、实验结果。
计算机视觉实验报告-直方图归一化和均衡化
1实验目的安装、配置、熟悉Python+Opencv开发环境图像读、写等的基本操作选取一张自己的生活照,实现:直方图归一化和均衡化(基础实现,如果实现了自适应,加分)快速傅里叶变换和高斯滤波(使用不同的sigma,分析sigma大小对图像清晰度的影响,至少使用三种不同的sigma)。
2实验过程Pycharm终端输入pip opencv后却不能编译有opencv函数的代码电脑上原来有个python环境,编译选项是原来的环境,但opencv库安装在conda 设置里把编译器改成conda2.1直方图归一化和均衡化归一化实验图片所用代码import cv2import numpy as npimport matplotlib.pyplot as pltdef hist_normalization(img, a=0, b=255):c = img.min()d = img.max()out = img.copy()# normalizationout = (b - a) / (d - c) * (out - c) + aout[out < a] = aout[out > b] = bout = out.astype(np.uint8)return outif __name__ == '__main__':img =cv2.imread('img/in.jpeg').astype(np.uint8)arr=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)shape=arr.shape# 因为手机拍摄照片灰度范围是0~255,直接归一化没有效果,所以修改像素灰度值来缩小灰度范围,使效果明显for i in range(0,shape[0]):for j in range(0,shape[1]):if arr[i,j]<50:arr[i,j]*=1.5elif arr[i,j]>200:arr[i,j]*=0.8out=hist_normalization(arr)plt.hist(out.ravel(),bins=255,rwidth=0.8,range=(0,255))plt.savefig('img/out3.png')cv2.imwrite("img/out.jpg",out)实验效果代码分析及现象直方图相比原来,被拉开的更散均衡化实验图片所用代码import cv2import numpy as npimport matplotlib.pyplot as pltif __name__ == '__main__':img =cv2.imread('img/in.jpeg').astype(np.uint8)img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)equalization = cv2.equalizeHist(img)cv2.imshow('Equalization', equalization)cv2.waitKey(0)实验效果代码分析及现象图片灰度变得更均匀2.2快速傅里叶变换和高斯低通滤波快速傅里叶变化实验图片所用代码import cv2import numpy as npif __name__ == '__main__':img =cv2.imread('img/in.jpeg',cv2.IMREAD_GRAYSCALE)# 2. 进行快速傅里叶变换,数据类型需转换为单精度fft = np.fft.fft2(np.float32(img))# 3. 频谱中心化fft_shift = np.fft.fftshift(fft)# 4. 灰度值缩放,便于显示fft_shift = 15 * np.log(np.abs(fft_shift))# 5. 数据类型转换fft_shift = fft_shift.astype(np.uint8)# 6. 显示结果cv2.imwrite('img/out.jpg', fft_shift)cv2.imshow('Image', img)cv2.imshow('FFT', fft_shift)cv2.waitKey(0)实验效果代码分析及现象原图变成了中间一个光源向四处发散的图像高斯低通滤波实验图片所用代码import numpy as npimport cv2import numpy.random as randomdef add_salt_noise(image, prob=0.1):output = np.zeros(image.shape, np.uint8)for i in range(image.shape[0]):for j in range(image.shape[1]):if random.random() < prob:if random.random() < 0.5:output[i, j] = 0else:output[i, j] = 255else:output[i, j] = image[i, j]return outputif __name__ == '__main__':# 1. 读取图像文件image_path = 'img/in.jpeg'image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)# 2. 添加椒盐噪声noise = add_salt_noise(image, prob=0.1)# 3. 高斯滤波kernel_size = 3gaussian = cv2.GaussianBlur(noise, (kernel_size, kernel_size), sigmaX=1)for i in range(0,9):gaussian = cv2.GaussianBlur(gaussian, (kernel_size, kernel_size), sigmaX=1)# 4. 显示图像cv2.imshow('Image', image)cv2.imshow('Noise', noise)cv2.imshow('Gaussian', gaussian)cv2.waitKey(0)实验效果Sigma=1Sigma=0.1Sigma=0.5代码分析及现象随着sigma增大,去噪效果增强,不过sigma在1之后继续增大时效果不明显3实验心得熟悉了opencv的基本操作,深入得理解了怎样对图片处理使其质量更好,对于其中出现的问题也能通过bing等搜索引擎找到答案。
matlab 直方图均衡实验报告
基于直方图的灰度级修正班级:电子信息科学与技术0901班姓名:学号:设计时间: 2012年5月24日一 设计课题:基于直方图的灰度级修正二 设计内容及要求:实验原理: 1.直方图均衡化处理技术是用累积分布函数作变换函数的直方图修正方法;2.用累积分布函数作为变换函数可产生一幅灰度级分布具有均匀概率密度的图像。
均衡步骤:1、统计原始图像的直方图,求出)(k r r P ;2、用累积分布函数作变换∑==kj j r k r P s 0)( ,求变换后的新灰度;3、用新灰度代替旧灰度,求出)(k s s P ,这一步是近似的,力求合理,同时把灰度相等的或相近的合在一起。
设计要求:1. 利用fopen 等函数打开*.dat 文件,采用for 循环统计图像里各灰度级的个数,并用换图函数表示出来。
2. 将打开的图像,采用直方图均衡对原始图像进行灰度级转换,并绘出其灰度直方图。
三 程序设计及其说明:本程序采用matlab GUI 绘图来实现,操作界面、菜单内容如下:图1 操作界面图2 菜单内容程序特色:1.原始图像灰度直方图统计算法一for l=0:255for i=1:rowif fid(i,1)==lh(l+1)=h(l+1)+1;endendend2. 原始图像灰度直方图统计算法二for i=1:rowh(fid(i)+1)=h(fid(i)+1)+1;end由主要代码部分可以看出:算法二算法复杂度很小,这是利用fopen打开文件的特色来决定的,它读入数组时是m行1列。
四实验结果及分析:灰度直方图统计:原始图像与均衡后图像灰度直方图(以LENA女孩图像为例)不同亮度图像直方图均衡效果显示1. LENA 图像 (1)正常图5 LENA 正常 原始及均衡后图像显示(2)高亮度图3 原始图像直方图图4 图像均衡后直方图图6 LENA高光原始及均衡后图像显示(3)偏暗图7 LENA偏暗原始及均衡后图像显示2.couple图像(1)正常图8 couple正常原始及均衡后图像显示图9 couple高亮原始及均衡后图像显示(3)偏暗图10 couple偏暗原始及均衡后图像显示3.NBA图像(1)正常图11 NBA正常原始及均衡后图像显示(3)偏暗图13 NBA偏暗原始及均衡后图像显示不同亮度的原始图像与均衡后图像灰度直方图1. LENA图像(1)正常(2)高亮度(3)偏暗图16 原始图像直方图图17 图像均衡后直方图图14 原始图像直方图图15 图像均衡后直方图2. couple 图像 (1)正常(2)高亮度图20 原始图像直方图图21 图像均衡后直方图图18 原始图像直方图图19 图像均衡后直方图(3)偏暗3. NBA 图像 (1)正常图24 原始图像直方图图25 图像均衡后直方图图22 原始图像直方图图23 图像均衡后直方图(2)高亮度(3)偏暗图28 原始图像直方图图29 图像均衡后直方图图26 原始图像直方图图27 图像均衡后直方图结果分析:通过几个图像显示结果可以看出:直方图均衡结果使图像亮度有所提高,所以它对比较暗的图像显示的更加清晰,而太亮的图像或曝光过度的图像,经过直方图均衡,效果不是很好,但是轮廓勾画的会明显些。
大学认识实习(图像直方图均衡化)报告
subplot(2,2,3);
imshow(J)
title('均衡化后的图象');
subplot(2,2,4);
imhist(J);%画出灰度图像的直方图
title('均衡化后的直方图');
3程序分析
该段程序比较简洁,主要直接调用系统函数来直接实现相关功能,首先利用imread()函数来读取miss1.jpg图像的像素的灰度值,并作为向量存放在I中,利用imhist直接绘出初始图像像素的直方图。通过调用histeq()函数来实现图像的均衡化,并利用同样的方式来显示图像以及均衡化后的图像直方图。
②中兴通讯股份有限公司南京研发中心介绍
中兴通讯股份有限公司南京研发中心成立于1993年9月,是中兴通讯全球15个研发机构之一,是中兴通讯重要的研发基地,承担着中兴通讯大型交换系统、数据网络、网络增值业务以及面向未来的网络核心设备等重要的研发任务。南京研发中心已入驻人员1.3万余人。
中兴通讯一区一期项目占地120亩,于2001年3月投资建设,2002年2月竣工并投入使用,建筑面积4.5万平方米;中兴通讯一区二期项目占地87亩,于2005年7月开工建设,2006年11月南楼建成投入使用,2009年12月北楼建成投入使用,总建筑面积约6万平方米。中兴二区占地面积约574亩,计划投资11.88多亿元人民币,一期建筑面积约20万平方米已经入驻。南京研发中心目前已成为国内最大的以未来通讯为核心的生产、研发基地,也是作为向国际市场展示的中心,邀请各国政要到研发基地考察,并与国内外技术专家进行研发合作。另外,随着3G网络建设的全面展开,除原有的产品继续在南京当地实现相关的产值与税收外,3G核心网相关的全系列软件产品,亦落地南京,将实现相当的产值和税收。
直方图均衡化实验报告
直方图均衡化实验报告直方图均衡化实验报告引言:直方图均衡化是一种常用的图像处理技术,它可以增强图像的对比度和细节,使得图像更加清晰明亮。
本实验旨在通过实际操作验证直方图均衡化的效果,并探讨其在不同场景下的应用。
实验步骤:1. 图像获取与预处理:选择一张高对比度的彩色图像作为实验对象,通过图像处理软件将其转换为灰度图像。
确保图像的亮度范围适中,避免过亮或过暗的情况。
2. 直方图均衡化算法:实现直方图均衡化算法的代码,可以使用Python等编程语言。
算法的核心思想是将原始图像的像素值映射到新的像素值,使得新图像的直方图均匀分布在整个灰度范围内。
3. 实验结果展示:将经过直方图均衡化处理后的图像与原始图像进行对比展示。
通过观察图像的对比度、亮度和细节等方面的变化,评估直方图均衡化算法的效果。
实验结果与分析:经过直方图均衡化处理后,图像的对比度明显增强,细节更加清晰可见。
原本过亮或过暗的区域得到了适当的修正,使得整个图像的亮度分布更加均匀。
同时,图像中的细节也得到了突出,使得观察者能够更好地识别和分析图像中的内容。
在实际应用中,直方图均衡化可以用于图像增强、目标检测、图像匹配等领域。
例如,在安防监控系统中,直方图均衡化可以提高图像的对比度,使得目标物体更加明显,有利于目标检测和识别。
在医学图像处理中,直方图均衡化可以增强图像的细节,有助于医生对病灶的判断和诊断。
然而,直方图均衡化也存在一些局限性。
首先,直方图均衡化是一种全局操作,对整个图像进行处理,可能会导致某些局部细节的损失。
其次,直方图均衡化对于亮度变化较大的图像效果较差,可能会导致过度亮化或过度暗化的问题。
因此,在实际应用中,需要根据具体情况选择合适的图像处理方法。
结论:通过本次实验,我们验证了直方图均衡化在图像处理中的有效性。
直方图均衡化可以增强图像的对比度和细节,使得图像更加清晰明亮。
然而,直方图均衡化也存在一些局限性,需要根据具体情况选择合适的图像处理方法。
直方图均衡实验报告
数字图像处理实验报告实验二图像直方图均衡姓名:*******学号:*********专业:************一.实验目的学习并掌握图像直方图均衡的基本理论,并通过分析均衡前后的图像验证课堂教学内容,总结直方图均衡的特点。
二.实验内容对图像 img2 进行直方图均衡(img2为X光片图像)1.对比均衡前后图像的直方图及特点,①图形显示其直方图以及灰度映射关系②计算以下参数:概率非零灰度数,概率非零灰度中最大概率、最小概率、最大最小概率之比。
③统计图像中概率大于平均概率的灰度级数;④计算非零概率的平均值和方差⑤您认为哪些参数能够表现图像直方图分布的均匀程度?试提取相关参数进行测试。
2.找一到两幅图像重复上述实验。
3.通过实验结果对比,能得出什么结论?三、实验报告要求1.源程序(C或Matlab):(1).画直方图的Matlab程序filname='E:\课件\大三下\图像处理\实验二\1.bmp'; //打开文件A=imread(filname); //读取文件信息imhist(A); //画出图像文件的直方图(2)C程序#include<stdio.h>#include<windows.h>#include<string.h>#include<math.h>BITMAPFILEHEADER bfh;BITMAPINFOHEADER bih;typedef struct PP{unsigned char GRAY;}PIXEL;////画出灰度映射关系图////void draw(double s[]){FILE *fout,*fin;int i,j;PIXEL p[256][256];BITMAPFILEHEADER m_bfh;BITMAPINFOHEADER m_bih;RGBQUAD colorPanel[256];fin=fopen("1.bmp","rb");fread(&m_bfh,1,sizeof(BITMAPFILEHEADER),fin);fread(&m_bih,1,sizeof(BITMAPINFOHEADER),fin);fread(colorPanel,256,sizeof(RGBQUAD),fin);fclose(fin);fout=fopen("Gray mapping relationship.bmp","wb");m_bih.biWidth=256;m_bih.biHeight=256;m_bih.biSizeImage=256*256;m_bfh.bfSize=m_bfh.bfOffBits+m_bih.biSizeImage;for(i=0;i<256;i++)for(j=0;j<256;j++) p[i][j].GRAY=255;for(i=0;i<256;i++){j=(int)s[i];p[i][j].GRAY=0;}fwrite(&m_bfh,1,sizeof(BITMAPFILEHEADER),fout);fwrite(&m_bih,1,sizeof(BITMAPINFOHEADER),fout);fwrite(colorPanel,256,sizeof(RGBQUAD),fout);fwrite(p,256*256,1,fout);fclose(fout);}////统计概率非零灰度数子函数 ///double nonzero(double p[])int i;double sum=0;for(i=0;i<256;i++)if(p[i]!=0) sum=sum+1;printf("概率非零灰度数:%.2f\n",sum);return sum;}////找到最大概率子函数////double lmax(double p[]){int i;double max;for(i=0;i<256;i++) //对max初始化if(p[i]!=0){max=p[i];break;}for(i=0;i<256;i++)if(p[i]!=0&&p[i]>max) max=p[i]; //找出概率非零最大值printf("概率非零最大值:%lf\n",max);return max;}////找到最小概率子函数////double lmin(double p[]){int i;double min;for(i=0;i<256;i++) //对min初始化if(p[i]!=0){min=p[i];break;}for(i=0;i<256;i++)if(p[i]!=0&&p[i]<min) min=p[i]; //找出概率非零最小值printf("概率非零最小值:%lf\n",min);return min;}////求最大最小概率之比子函数////double rate(double max,double min){double r;r=max/min;printf("最大最小概率之比:%lf\n",r);return r;}////统计图像中概率大于平均概率的灰度级数子函数 //// double lager(double p[]){int i;double sum=0;for(i=0;i<256;i++)if(p[i]>1.0/256) sum=sum+1;printf("图像中概率大于平均概率的灰度级数:%lf\n",sum);return sum;}////求非零概率的平均值的子函数////double average(double sum){double aver;aver=1.0/sum;printf("非零概率的平均值:%lf\n",aver);return aver;}////求非零概率的方差的子函数////double variance(double sum,double p[],double aver){int i;double asum=0,var;for(i=0;i<256;i++)if(p[i]!=0) asum=asum+pow((p[i]-aver),2);//printf("%lf\n",asum);var=asum/sum;printf("非零概率的方差:%lf\n",var);return var;}/////主函数//////int main(){FILE *fin,*fout;RGBQUAD colorPanel[256];PIXEL **bmpData;long i,j;double num[256]={0},p[256]={0},s[256]={0};double max,min,r,sum=0,asum=0,aver,psum=0,var;fin=fopen("1.bmp","rb");fread(&bfh,1,sizeof(BITMAPFILEHEADER),fin);fread(&bih,1,sizeof(BITMAPINFOHEADER),fin);fread(colorPanel,256,sizeof(RGBQUAD),fin);bmpData=(PIXEL **)malloc(bih.biHeight*sizeof(PIXEL *));for(i=0;i<bih.biHeight;i++){bmpData[i]=(PIXEL *)malloc(bih.biWidth*sizeof(PIXEL));fread(bmpData[i],bih.biWidth,sizeof(PIXEL),fin);}fclose(fin);////对图像进行直方图均衡////for(i=0;i<bih.biHeight;i++){ //二重循环遍历图象数据for(j=0;j<bih.biWidth;j++){num[bmpData[i][j].GRAY]++; //当前灰度级象素/总象素}}for(i=0;i<256;i++)p[i]=num[i]/bih.biWidth/bih.biHeight; //计算灰度概率s[0]=p[0];for(i=1;i<256;i++){s[i]=s[i-1]+p[i]; //计算累积概率(低灰度概率加到高灰度概率上)}for(i=0;i<256;i++){ //0~1映射到0~255s[i]=s[i]*255;for(j=0;j<256;j++){if(s[i]>=j-0.5&&s[i]<j+0.5)s[i]=j;}}for(i=0;i<bih.biHeight;i++){ //对原图像进行直方图均衡for(j=0;j<bih.biWidth;j++){bmpData[i][j].GRAY=(unsignedchar)s[bmpData[i][j].GRAY];}}////计算各个参数////sum=nonzero(p); //概率非零灰度数max=lmax(p); //概率非零灰度中最大概率min=lmin(p); //概率非零灰度中最小概率r=rate(max,min); //最大最小概率之比asum=lager(p); //图像中概率大于平均概率的灰度级数aver=average(sum); //非零概率的平均值var=variance(sum,p,aver); //非零概率的方差draw(s); //画灰度映射关系曲线fout=fopen("3.bmp","wb");fwrite(&bfh,1,sizeof(BITMAPFILEHEADER),fout);fwrite(&bih,1,sizeof(BITMAPINFOHEADER),fout);fwrite(colorPanel,256,sizeof(RGBQUAD),fout);for(i=0;i<bih.biHeight;i++)fwrite(bmpData[i],bih.biWidth,sizeof(PIXEL),fout);fclose(fout);return 0;}2.程序流程图:3.实验结果图像及对应参数:(1)图一:均衡前:均衡前直方图:灰度映射:对应参数:均衡后:均衡后的直方图:对应参数:均衡前后灰度映射关系:横轴表示均衡前的灰度,纵轴表示均衡后的灰度。
实验二 直方图均衡化
福建农林大学计算机与信息学院实验报告系:专业:年级:姓名:学号:实验室号_______ 计算机号实验时间:指导教师签字:成绩:报告退发(订正、重做)实验二直方图均衡化1.实验目的和要求掌握直方图均衡化算法。
2.实验内容和原理(1)编写一个函数计算数字图像直方图;(2)通过调用直方图计算函数实现直方图均衡化;(3)对比数字图像变化前后的直方图;3.实验环境硬件:一般PC机操作系统:WindowsXP编程平台:MATLAB 或高级语言4.算法描述及实验步骤Code:X=imread(' ‘);subplot(2,2,1) ;imshow(X); title 原图b=size(X);N=b(1)*b(2);n=zeros(1,256);for(i=1:b(1))for(j=1:b(2))n(1,X(i,j)+1)=n(1,X(i,j)+1)+1;end;end;s=zeros(1,256);for(k=1:256)for(j=1:k)s(1,k)=s(1,j)+n(1,j)/N;end;end;Y=zeros(b);for(i=1:b(1))for(j=1:b(2))Y(i,j)=s(1,X(i,j)+1);end;end;Y=mat2gray(Y);subplot(2,2,2) ;imshow(Y); title 均衡化subplot(2,2,3) ;imhist(X); title 原图直方图; subplot(2,2,4) ;imhist(Y); title 均衡化后直方图; figure;Z=zeros(b);Z=histeq(X);subplot(1,2,1) ;imshow(Z); title 原图subplot(1,2,2) ;imhist(Z); title 利用函数均衡化5.调试过程6.实验结果7.总结。
数字图像处理直方图均衡实验报告
数字图像报告班级:姓名:学号:一、直方图均衡:直方图均衡化也叫做直方图平坦化,是一种常用的灰度增强算法。
目的:曾强对比度目标:均匀分度原理:假设灰度级为归一化至范围[0,1]内的连续量,并令Pr (r)表示某给定图像中的灰度级的概率密度函数(PDF),其下标用来区分输入图像和输出图像的PDF。
假设我们对输入灰度级执行如下变换,得到(处理后的)输出灰度级s:S=T(r)=∫0r Pr(w)dw式中w 是积分的哑变量。
可以看出,输出灰度级的概率密度函数是均匀的,即a.当0≤s≤1 时,Ps(s)=1b.当s 为其他时,Ps(s)=0换言之,前述变换生成一幅图像,该图像的灰度级较为均衡化,且覆盖了整个范围[0,1]。
灰度级均衡化处理的最终结果是一幅扩展了动态范围的图像,它具有较高的对比度。
该变换函数只不过是一个累积分布函数(CDF)。
二、直方图均衡程序:clc主程序:picture=input('please input the filename:','s');fid=fopen(picture);dat=fread(fid);d=dat';B=reshape(d,256,256);h=length(d);newname=input('输入新的文件名:','s');zhi(h,newname,B,d);子程序:function y=zhi(h,newname,B,d)figure(1);imshow(uint8(B'));N=zeros(1,256);for i=0:255for j=1:hif i==d(j)N(i+1)=N(i+1)+1;endendendi=0:255;p=N/h;figure(2)stem(i,p,'.')title('原始直方图')m=zeros(1,256);for k=1:256if k==1m(k)=p(k);elsem(k)=m(k-1)+p(k);endendfor k=1:256r=round(m*255);ends=zeros(1,256);for a=1:256for b=1:256if r(a)==r(b)s(a)=N(a)+N(b);endendendq=s/h;for j=1:256k(j)=r(j);endfigure(3);stem(k,q,'.');title('均衡直方图');M=zeros(1,h);for i=1:hk=d(i);M(i)=r(k+1);endR=reshape(M,256,256);figure(4);imshow(uint8(R'));jht=fopen(newname,'wb');g=fwrite(jht,M);fclose('all');原图像原始直方图均衡直方图均衡后的图像:三、体会:通过本次设计,让我学会了从问题的高度来考虑设计的方方面面,对程序的设计和研究有了更深刻的体会;让我了解到程序的设计是建立在对理论知识了解的基础上的,特别是对直方图均衡化的原理要有较为详细的了解,此外对直方图均衡化算法也要进行了解;在编写程序时,进行模块化设计,以严谨的态度进行编程,避免出现低级错误。
图像工程概论实验报告——二值化直方图均衡化
图像工程概论实验报告课程报告1:一、实验目的:二、实验内容把这幅图像分成同样大小的10幅人脸图片然后分别对第一行5幅人脸图像的第3 第4 第5 第二行5幅人脸图像的第1 第5 进行如下处理:1.进行大津法阈值分割的二值化处理2.进行直方图均衡化处理三、实验具体代码以及结果(一)大津法阈值分割的二值化处理1.实验代码%图像分割部分clear;clc;pic0=imread('G: \image\histogram matching.bmp');figure(1),imshow(pic0);wdiv=5;hdiv=2;[hd,wd,l]=size(pic0);sub_wd=floor(wd/wdiv);sub_hd=floor(hd/hdiv);for row=1:2for col=1:5pic1=pic0((row-1)*sub_hd+1:row*sub_hd+1,(col-1)*sub_wd+1:col*sub_ wd+1);figure(2),imshow(pic1);imwrite(pic1,['G: \image\'num2str(row) '-'num2str(col) '.jpg'],'jpg'); %存储图像endend%————————图像处理部分cd 'G:\pic'x1=imread('1-3.jpg'); %目标读取图像第一行第三幅人脸图像x2=imread('1-4.jpg'); %第一行第四幅人脸图像x3=imread('1-5.jpg'); %第一行第五幅人脸图像x4=imread('2-1.jpg'); %第二行第一幅人脸图像x5=imread('2-5.jpg'); %第二行第五幅人脸图像%matlab 自动确定阈值的方法,大津法,类间方差level1=graythresh(x1);level2=graythresh(x2);level3=graythresh(x3);level4=graythresh(x4);level5=graythresh(x5);%用得到的阈值直接对图像进行二值化处理并显示BW1=im2bw(x1,level1);BW2=im2bw(x2,level2);BW3=im2bw(x3,level3);BW4=im2bw(x4,level4);BW5=im2bw(x5,level5);subplot(1,5,1),imshow(BW1);subplot(1,5,2),imshow(BW2);subplot(1,5,3),imshow(BW3);subplot(1,5,4),imshow(BW4);subplot(1,5,5),imshow(BW5);2.实验结果显示分割结果截图:进行大津法阈值分割的二值化处理后截图:(二)直方图均衡化处理1.实验代码%图像分割部分clear;clc;pic0=imread('G: \image\histogram matching.bmp'); %figure(1),imshow(pic0);wdiv=5;hdiv=2;[hd,wd,l]=size(pic0);sub_wd=floor(wd/wdiv);sub_hd=floor(hd/hdiv);for row=1:2for col=1:5pic1=pic0((row-1)*sub_hd+1:row*sub_hd+1,(col-1)*sub_wd+1:col*sub_ wd+1);figure(2),imshow(pic1);imwrite(pic1,['G: \image\'num2str(row) '-'num2str(col) '.jpg'],'jpg'); %存储图像endend%图像处理部分cd 'G:\pic'x1=imread('1-3.jpg'); %目标读取图像第一行第三幅人脸图像x2=imread('1-4.jpg'); %第一行第四幅人脸图像x3=imread('1-5.jpg'); %第一行第五幅人脸图像x4=imread('2-1.jpg'); %第二行第一幅人脸图像x5=imread('2-5.jpg'); %第二行第五幅人脸图像%直方图均衡化处理%调用直方图均衡化函数 histeq()%均衡化处理前后的灰度级直方图分布,采用两行十列显示subplot(2,5,1),imhist(rgb2gray(x1)); %第一行第三幅人脸图像subplot(2,5,6),imhist(histeq(rgb2gray(x1)));subplot(2,5,2),imhist(rgb2gray(x2)); %第一行第四幅人脸图像subplot(2,5,7),imhist(histeq(rgb2gray(x2)));subplot(2,5,3),imhist(rgb2gray(x3)); %第一行第五幅人脸图像subplot(2,5,8),imhist(histeq(rgb2gray(x3)));subplot(2,5,4),imhist(rgb2gray(x4)); %第二行第一幅人脸图像subplot(2,5,9),imhist(histeq(rgb2gray(x4)));subplot(2,5,5),imhist(rgb2gray(x5)); %第二行第五幅人脸图像subplot(2,5,10),imhist(histeq(rgb2gray(x5)));%显示均衡化处理后的图像figure(11),imshow(histeq(rgb2gray(x1)));figure(12),imshow(histeq(rgb2gray(x2)));figure(13),imshow(histeq(rgb2gray(x3)));figure(14),imshow(histeq(rgb2gray(x4)));figure(15),imshow(histeq(rgb2gray(x5)));2.实验结果显示①直方图②均衡化处理后人脸图像。
直方图均衡化和匹配报告
直方图均衡化和匹配报告一.实验目的:加强直方图均衡化和直方图匹配的图像增强技术的认识和了解; 学会用Matlab 中的下列函数对输入图像进行上述2类运算; 感受各种不同的直方图图像增强处理方法对最终图像效果的影响; 二.实验内容:1.熟悉Matlab 文件中有关Imhist 和histeq 函数的使用说明,充分理解其使用方法并能运用它们完成实验内容。
2.将mountain.jpg 图像文件读入Matlab ,对其作直方图均衡化。
显示运算前后该图像的直方图,处理后的图像。
3.对mountain.jpg 图像做直方图匹配运算,显示运算前后该图像的直方图,处理后的图像和灰度变换函数。
直方图反映灰度等级的分布情况,本实验指定的直方图如下:1400×rr ≤5 7000-310×r 5<r ≤20 900-5×r 20<r ≤180 -1440+8×r 180<r ≤225 3060-12×r225<r ≤2554.利用mountain.jpg 图像的直方图(imhist 函数可生成),编写直方图均衡化函数,显示灰度变换函数。
三.实验结果与分析:1.图像均衡化处理前后的直方图和图像对比原图像 均衡化后的图像n =原图像直方图均衡化后的直方图由处理后的图像可以看出,图像的灰度值减少,图像对比度明显增强,但是导致很多地方的细节模糊,看不清楚;而且有些地方过分增强,严重干扰清晰度。
2.直方图匹配处理前后图像对比原图像处理后图像原图像直方图直方图匹配运算后的直方图直方图匹配运算函数采用直方图匹配运算后,发现效果明显比直接均衡化的效果好的多,将一些重要的细节突出来了,对比度明显增强,但是有些地方色彩过于暗淡,灰度值过高,影响了图像的美观,但用于进行图像对比分析还是比较实用的。
3.编写的直方图均衡化函数,进行灰度变换原图处理后图像原图直方图处理后直方图最后一步通过自己编写的程序,对直方图进行均衡化,效果与第一步所取得的效果差不多是一致的。
实验报告2:直方图的均衡
实验报告1.数字图像直方图均衡的算法原理直方图均衡的主要原理是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布,通过将不同灰度值的像素数量进行统计,并将图像的像素值进行重新分配,把一定范围的像素过于密集的灰度值重新分配到较广的灰度区域内,使得整体灰度范围内每个灰度值的像素数量基本相同。
2.数字图像直方图均衡的算法步骤I.设均衡前图像在(x,y)处灰度值为f(x,y),均衡后图像的灰度值为g(x,y)II.设直方图变换函数为g(x,y)=M(f(x,y))III.令M(t)在(0,L-1)上单调递增,且使得f(x,y)和g(x,y)均属于(0,L-1)。
IV.计算每个灰度级的频数p(x,y)=f(x,y)/NV.此时计算累计分布函数C(x,y)=Σp(x,y)VI.利用M(t)计算均衡后的灰度级:g(x,y)=INT[(gmax-gmin)C(x,y)+gmin+0.5]3.MATLAB代码对RGB通道独立地进行直方图均衡的代码实现:RGB=imread('yuanban.jpg');R=RGB(:,:,1);G=RGB(:,:,2);B=RGB(:,:,3);subplot(4,2,1),imshow(RGB);title('原始真彩色图像');subplot(4,2,3),imshow(R);title('真彩色图像的红色分量');subplot(4,2,4), imhist(R);title('真彩色图像的红色分量直方图');subplot(4,2,5),imshow(G);title('真彩色图像的绿色分量');subplot(4,2,6), imhist(G);title('真彩色图像的绿色分量直方图');subplot(4,2,7),imshow(B);title('真彩色图像的蓝色分量');subplot(4,2,8), imhist(B);title('真彩色图像的蓝色分量直方图');r=histeq(R);g=histeq(G);b=histeq(B);figure,subplot(3,2,1),imshow(r);title('红色分量均衡化后图像');subplot(3,2,2), imhist(r);title('红色分量均衡化后图像直方图');subplot(3,2,3),imshow(g);title('绿色分量均衡化后图像');subplot(3,2,4), imhist(g);title('绿色分量均衡化后图像直方图');subplot(3,2,5), imshow(b);title('蓝色分量均衡化后图像');subplot(3,2,6), imhist(b);title('蓝色分量均衡化后图像直方图');figure,newimg = cat(3,r,g,b);imshow(newimg,[]);title('均衡化后分量图像还原输出原图');4.均衡效果对比:原图:Matlab直方图均衡后效果图:PS均衡后效果图:差别:原图颜色较暗,并且大部分区域灰度值偏低,仅有部分地方灰度值较亮。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字图像处理实验报告实验二图像直方图均衡姓名:*******学号:*********专业:************一.实验目的学习并掌握图像直方图均衡的基本理论,并通过分析均衡前后的图像验证课堂教学内容,总结直方图均衡的特点。
二.实验内容对图像 img2 进行直方图均衡(img2为X光片图像)1.对比均衡前后图像的直方图及特点,①图形显示其直方图以及灰度映射关系②计算以下参数:概率非零灰度数,概率非零灰度中最大概率、最小概率、最大最小概率之比。
③统计图像中概率大于平均概率的灰度级数;④计算非零概率的平均值和方差⑤您认为哪些参数能够表现图像直方图分布的均匀程度?试提取相关参数进行测试。
2.找一到两幅图像重复上述实验。
3.通过实验结果对比,能得出什么结论?三、实验报告要求1.源程序(C或Matlab):(1).画直方图的Matlab程序filname='E:\课件\大三下\图像处理\实验二\1.bmp'; //打开文件A=imread(filname); //读取文件信息imhist(A); //画出图像文件的直方图(2)C程序#include<stdio.h>#include<windows.h>#include<string.h>#include<math.h>BITMAPFILEHEADER bfh;BITMAPINFOHEADER bih;typedef struct PP{unsigned char GRAY;}PIXEL;////画出灰度映射关系图////void draw(double s[]){FILE *fout,*fin;int i,j;PIXEL p[256][256];BITMAPFILEHEADER m_bfh;BITMAPINFOHEADER m_bih;RGBQUAD colorPanel[256];fin=fopen("1.bmp","rb");fread(&m_bfh,1,sizeof(BITMAPFILEHEADER),fin);fread(&m_bih,1,sizeof(BITMAPINFOHEADER),fin);fread(colorPanel,256,sizeof(RGBQUAD),fin);fclose(fin);fout=fopen("Gray mapping relationship.bmp","wb");m_bih.biWidth=256;m_bih.biHeight=256;m_bih.biSizeImage=256*256;m_bfh.bfSize=m_bfh.bfOffBits+m_bih.biSizeImage;for(i=0;i<256;i++)for(j=0;j<256;j++) p[i][j].GRAY=255;for(i=0;i<256;i++){j=(int)s[i];p[i][j].GRAY=0;}fwrite(&m_bfh,1,sizeof(BITMAPFILEHEADER),fout);fwrite(&m_bih,1,sizeof(BITMAPINFOHEADER),fout);fwrite(colorPanel,256,sizeof(RGBQUAD),fout);fwrite(p,256*256,1,fout);fclose(fout);}////统计概率非零灰度数子函数 ///double nonzero(double p[])int i;double sum=0;for(i=0;i<256;i++)if(p[i]!=0) sum=sum+1;printf("概率非零灰度数:%.2f\n",sum);return sum;}////找到最大概率子函数////double lmax(double p[]){int i;double max;for(i=0;i<256;i++) //对max初始化if(p[i]!=0){max=p[i];break;}for(i=0;i<256;i++)if(p[i]!=0&&p[i]>max) max=p[i]; //找出概率非零最大值printf("概率非零最大值:%lf\n",max);return max;}////找到最小概率子函数////double lmin(double p[]){int i;double min;for(i=0;i<256;i++) //对min初始化if(p[i]!=0){min=p[i];break;}for(i=0;i<256;i++)if(p[i]!=0&&p[i]<min) min=p[i]; //找出概率非零最小值printf("概率非零最小值:%lf\n",min);return min;}////求最大最小概率之比子函数////double rate(double max,double min){double r;r=max/min;printf("最大最小概率之比:%lf\n",r);return r;}////统计图像中概率大于平均概率的灰度级数子函数 //// double lager(double p[]){int i;double sum=0;for(i=0;i<256;i++)if(p[i]>1.0/256) sum=sum+1;printf("图像中概率大于平均概率的灰度级数:%lf\n",sum);return sum;}////求非零概率的平均值的子函数////double average(double sum){double aver;aver=1.0/sum;printf("非零概率的平均值:%lf\n",aver);return aver;}////求非零概率的方差的子函数////double variance(double sum,double p[],double aver){int i;double asum=0,var;for(i=0;i<256;i++)if(p[i]!=0) asum=asum+pow((p[i]-aver),2);//printf("%lf\n",asum);var=asum/sum;printf("非零概率的方差:%lf\n",var);return var;}/////主函数//////int main(){FILE *fin,*fout;RGBQUAD colorPanel[256];PIXEL **bmpData;long i,j;double num[256]={0},p[256]={0},s[256]={0};double max,min,r,sum=0,asum=0,aver,psum=0,var;fin=fopen("1.bmp","rb");fread(&bfh,1,sizeof(BITMAPFILEHEADER),fin);fread(&bih,1,sizeof(BITMAPINFOHEADER),fin);fread(colorPanel,256,sizeof(RGBQUAD),fin);bmpData=(PIXEL **)malloc(bih.biHeight*sizeof(PIXEL *));for(i=0;i<bih.biHeight;i++){bmpData[i]=(PIXEL *)malloc(bih.biWidth*sizeof(PIXEL));fread(bmpData[i],bih.biWidth,sizeof(PIXEL),fin);}fclose(fin);////对图像进行直方图均衡////for(i=0;i<bih.biHeight;i++){ //二重循环遍历图象数据for(j=0;j<bih.biWidth;j++){num[bmpData[i][j].GRAY]++; //当前灰度级象素/总象素}}for(i=0;i<256;i++)p[i]=num[i]/bih.biWidth/bih.biHeight; //计算灰度概率s[0]=p[0];for(i=1;i<256;i++){s[i]=s[i-1]+p[i]; //计算累积概率(低灰度概率加到高灰度概率上)}for(i=0;i<256;i++){ //0~1映射到0~255s[i]=s[i]*255;for(j=0;j<256;j++){if(s[i]>=j-0.5&&s[i]<j+0.5)s[i]=j;}}for(i=0;i<bih.biHeight;i++){ //对原图像进行直方图均衡for(j=0;j<bih.biWidth;j++){bmpData[i][j].GRAY=(unsignedchar)s[bmpData[i][j].GRAY];}}////计算各个参数////sum=nonzero(p); //概率非零灰度数max=lmax(p); //概率非零灰度中最大概率min=lmin(p); //概率非零灰度中最小概率r=rate(max,min); //最大最小概率之比asum=lager(p); //图像中概率大于平均概率的灰度级数aver=average(sum); //非零概率的平均值var=variance(sum,p,aver); //非零概率的方差draw(s); //画灰度映射关系曲线fout=fopen("3.bmp","wb");fwrite(&bfh,1,sizeof(BITMAPFILEHEADER),fout);fwrite(&bih,1,sizeof(BITMAPINFOHEADER),fout);fwrite(colorPanel,256,sizeof(RGBQUAD),fout);for(i=0;i<bih.biHeight;i++)fwrite(bmpData[i],bih.biWidth,sizeof(PIXEL),fout);fclose(fout);return 0;}2.程序流程图:3.实验结果图像及对应参数:(1)图一:均衡前:均衡前直方图:灰度映射:对应参数:均衡后:均衡后的直方图:对应参数:均衡前后灰度映射关系:横轴表示均衡前的灰度,纵轴表示均衡后的灰度。