直方图均衡化例题

合集下载

图像直方图均衡实验

图像直方图均衡实验

/*初始化直方图背景为白色*/CvScalar white;white.val[0]=255;for(int i=0;i<dst->height;i++){for(int j=0;j<dst->width;j++){cvSet2D(dst, i, j, white);}}/*绘制横竖坐标*/CvScalar black;black.val[0] = 0;for(int i=0;i<280;i++){cvSet2D(dst, 280, i+10, black);}for(int i=0;i<280;i++){cvSet2D(dst, i+10, 20, black);}/*绘制直方图*/for(int i=0;i<256;i++){int high = count[i]*256/max;int x=20+i;for(int j=0;j<high;j++){int y=280-j;cvSet2D(dst, y, x, black);}}return dst;}实验结果如下图所示:2.通过计算归一化直方图,设计算法实现直方图均衡化处理。

核心代码如下:IplImage* Equalization(IplImage *src){IplImage* dst = cvCreateImage(cvGetSize(src),3.在灰度图像直方图均衡处理的基础上实现彩色直方图均衡处理。

核心代码如下:IplImage* ColorEqualization(IplImage *src){IplImage *dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);IplImage *pImageChannel[3] = {NULL};int i;for (i=0; i<3; i++) {pImageChannel[i] = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);}cvSplit(src, pImageChannel[0], pImageChannel[1], pImageChannel[2], NULL);for (i=0; i<src->nChannels; i++) {pImageChannel[i] = Equalization(pImageChannel[i]);}/*三通道合并*/cvMerge(pImageChannel[0], pImageChannel[1], pImageChannel[2], NULL, dst);return dst;}实验结果如下图所示:。

[数字图像处理](四)直方图均衡化[HE]算法

[数字图像处理](四)直方图均衡化[HE]算法

[数字图像处理](四)直⽅图均衡化[HE]算法图像处理(四)直⽅图均衡化0____前⾔直⽅图操作是图像处理中的⼀个基本⼯具。

从观察⼀些图像的直⽅图中我们可以发现,在暗图像中 ,⼤多数直⽅图灰度容集在灰度低端;类似的在亮图像的直⽅图中,⼤多数直⽅图灰度容集在灰度级的⾼端。

直⽅图均衡化就是通过计算每⼀灰度级数出现的概率,并将得到的概率前缀和映射到原图像中的过程,此处介绍的是最基本的基于全图像的均衡化的HE(直⽅图均衡化)算法,之后会继续介绍AHE(⾃适应直⽅图均衡化)与CLAHE(限制对⽐度直⽅图均衡)。

1____算法流程读⼊图像预处理统计每个灰度级数在图像中出现的次数计算每个灰度级数于总像素的概率,并统计数组的前缀和将得到的前缀和映射到原图像数组中2____MATLAB实现clc;close all;clear all;% 读⼊,预处理im = imread('p21.png');imgray = rgb2gray(im);figure;subplot(2,2,1);imshow(imgray);% 统计每个灰度级数hist = zeros(1,256);[n,m] = size(imgray);% 后⾯要+1因为图像的范围是在0~255,但是matlab的数组是从1开始映射的for i = 1:1:nfor j = 1:1:mhist( imgray(i,j)+1 ) = hist( imgray(i,j) +1) + 1;endendsubplot(2,2,2);bar(hist);% 求分布概率前缀和pro = zeros(1,256);sumim = sum(hist)pro(1) = hist(1)/sumim;for i = 2:1:256pro(i) = pro(i-1)+hist(i)/sumim;end% 灰度映射transim = zeros(n,m);for i = 1:1:nfor j = 1:1:mtransim(i,j) = pro(imgray(i,j))*255 + 0.5;endendtransim = uint8(transim);subplot(2,2,3);imshow(transim);subplot(2,2,4);imhist(transim);。

数字图像处理计算题复习精华版

数字图像处理计算题复习精华版

30452计算题复习一、直方图均衡化(P68)对已知图像进行直方图均衡化修正。

例:表1为已知一幅总像素为n=64×64的8bit数字图像(即灰度级数为8),各灰度级(出现的频率)分布列于表中。

要求将此幅图像进行均衡化修正(变换),并画出修正(变换)前后的直方图。

解:对已知图像均衡化过程见下表:画出直方图如下:(a)原始图像直方图(b)均衡化后直方图**以下部分不用写在答题中。

其中:①r k、n k中k = 0,1,…,7② p r (r k )= n k /n ,即计算各灰度级像素个数占所有像素个数的百分比,其中∑==kj jnn 0,在此题中n =64×64。

③ ∑==kj jrk r p s 0)(计,即计算在本灰度级之前(包含本灰度级)所有百分比之和。

④ ]5.0)1int[(+-=计并k k s L s ,其中L 为图像的灰度级数(本题中L = 8),int[ ]表示对方括号中的数字取整。

⑤ 并k k s s =⑥ n sk 为映射对应关系r k →s k 中r k 所对应的n k 之和。

⑦ n n s p sk k s /)(=,或为映射对应关系r k →s k 中r k 所对应的p r (r k )之和。

二、 模板运算 使用空间低通滤波法对图像进行平滑操作(P80)空间低通滤波法是应用模板卷积方法对图像每一个像素进行局部处理。

模板(或称掩模)就是一个滤波器,它的响应为H (r ,s ),于是滤波输出的数字图像g(x ,y )用离散卷积表示为)6.2.4(),(),(),(∑∑-=-=--=lls k k r s r H s y r x f y x g式中:x ,y = 0,1,2,…,N -1;k 、l 根据所选邻域大小来决定。

具体过程如下: (1)将模板在图像中按从左到右、从上到下的顺序移动,将模板中心与每个像素依次重合(边缘像素除外); (2)将模板中的各个系数与其对应的像素一一相乘,并将所有的结果相加; (3)将(2)中的结果赋给图像中对应模板中心位置的像素。

直方图的均衡化

直方图的均衡化

三、例题演示
设有1幅64x64,8bit灰度图像,其直方 图见图1,所用均衡化变换函数(即累积 直方图)见图2,均衡化后的直方图见图 3。
直方图均衡化计算列表
序号
运算
1 列出原始图灰度级Sk,k=0,1,…7
0
1
2
2 统计原始直方图各灰度级象素数Nk 790 1023 850
3 用式1计算原始直方图(图1)
对图像空间域点的增强过程是通过增强函数t=EH(s)来完成的, t、s分别为目标图像和原始图像上的像素点(x,y)处的灰度值。
在进行均衡化处理时,增强函数EH需要满足两个条件: 1)、增强函数EH(s)在0≤s≤L-1的范围内是一个单调递增函数,
这个条件保证了在增强处理时没有打乱原始图像的灰度排列次序; 2)、对于0≤s≤L-1应当有0≤EH(s)≤L-1,它保证了变换过程
0 sk 1
k=0,1,…L-1
公式(2)
根据该方程可以由原图像的各像素灰度值直接得到直方图均衡化后各 像素的灰度值。
在实际处理变换时,一般先对原始图像的灰度情况进行统计分析,并
计算出原始直方图分布,然后根据计算出的累计直方图分布 t k ,按式 tkint[(L1)tk0.5]对其取整扩展并得出原灰度s k 到 t k 的灰度映
%step1:get histogram
for i=1:m;
for j=1:n;
k=plane(i,j);
tmhist(k)=tmhist(k)+1;
end
end
四、直方图均衡化的原理程序(lm2.m)
%step2:get cdf
cdf(1)=tmhist(1);
for i=2:256
▪ 其实在MATLAB中,用imhist函数求图像直方图,histeq函数可 以实现直方图均衡化操作(histogram equalization)。

数字图像处理课程设计报告---直方图均衡化

数字图像处理课程设计报告---直方图均衡化

设计题目:直方图均衡化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 、用的映射关系修改原始图像的灰度级,从而获得直方图近似为均匀分布的输出图像。

3、源程序代码// cqxhistView.cpp : implementation of the CCqxhistView class#include "stdafx.h"#include "cqxhist.h"#include "cqxhistDoc.h"#include "cqxhistView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // CCqxhistView1,,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 kIMPLEMENT_DYNCREATE(CCqxhistView, CView)BEGIN_MESSAGE_MAP(CCqxhistView, CView)//{{AFX_MSG_MAP(CCqxhistView)ON_COMMAND(ID_OPEN_IMAGE, OnOpenImage)ON_COMMAND(ID_HIST_IMAGE, OnHistImage)//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CCqxhistView construction/destructionCCqxhistView::CCqxhistView(){// TODO: add construction code here}CCqxhistView::~CCqxhistView(){}BOOL CCqxhistView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////// // CCqxhistView drawingvoid CCqxhistView::OnDraw(CDC* pDC){CCqxhistDoc* 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();// 显示图像(具体的参数见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); }if(m_bHist==true){//绘制原图像的直方图CString str;int nh=m_dib.GetDIBHeight();int i;// 画坐标轴// 绘制坐标轴pDC->MoveTo(410,nh+20); //(410,nh+20 )是直方图的左上角坐标// 垂直轴pDC->LineTo(410,nh+200);//(410,nh+200 )是直方图的左下角坐标// 水平轴pDC->LineTo(710,nh+200);//(710,nh+200 )是直方图的右下角坐标// 写X轴刻度值str.Format("0");pDC->TextOut(410, nh+200+10, str);str.Format("50");pDC->TextOut(460, nh+200+10, str);str.Format("100");pDC->TextOut(510, nh+200+10, str);str.Format("150");pDC->TextOut(560, nh+200+10, str);str.Format("200");pDC->TextOut(610, nh+200+10, str);str.Format("255");pDC->TextOut(665, nh+200+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(705,nh+200-5);pDC->LineTo(710,nh+200);pDC->LineTo(705,nh+200+5);// 绘制y轴箭头pDC->MoveTo(410,nh+20);pDC->LineTo(405,nh+20+5);pDC->MoveTo(410,nh+20);pDC->LineTo(415,nh+20+5);int max=0;for(i=0;i<256;i++)if(m_yuan[i]>max)max=m_yuan[i];for(i=0;i<256;i++){pDC->MoveTo(410+i,nh+200);pDC->LineTo(410+i,nh+200-(m_yuan[i]*160/max));}}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);// 绘制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_hist[i]>max)max=m_hist[i];for(i=0;i<256;i++){pDC->MoveTo(10+i,nh+200);pDC->LineTo(10+i,nh+200-(m_hist[i]*160/max));}}}///////////////////////////////////////////////////////////////////////////// // CCqxhistView printingBOOL CCqxhistView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CCqxhistView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CCqxhistView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}///////////////////////////////////////////////////////////////////////////// // CCqxhistView diagnostics#ifdef _DEBUGvoid CCqxhistView::AssertValid() const{CView::AssertValid();}void CCqxhistView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CCqxhistDoc* CCqxhistView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCqxhistDoc)));return (CCqxhistDoc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CCqxhistView message handlersvoid CCqxhistView::OnOpenImage(){// TODO: Add your command handler code here// TODO: Add your command handler code herestatic char szFilter[]="BMP文件(*.bmp)|*.bmp||"; //定义过滤文件的类型 CFileDialog dlg(TRUE,"bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);//定义文件对话框对象 CString filename;int ret=dlg.DoModal(); //运行打开文件对方框if(ret==IDOK){filename=dlg.GetFileName(); //获取所选择图像的路径 m_dib.LoadFromFile(filename); //加载图像if(!m_dib.m_bLoaded) //判断是否加载图像成功{AfxMessageBox("图像打不开");return;}for(int i=0;i<256;i++) //初始化直方图数组{ m_hist[i]=0;m_yuan[i]=0;}m_bHist=false;}{int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();for(int j=0;j<nh;j++)for(int i=0;i<nw;i++){BYTE temp=m_dib.m_pdata[j*nw+i];m_yuan[temp]++;}}Invalidate(1); //刷新屏幕}void CCqxhistView::OnHistImage(){// TODO: Add your command handler code here//功能:实现直方图均衡化////////////////////////////判断图像是否打开,没打开,则弹出提示框并退出函数if(!m_dib.m_bLoaded){AfxMessageBox("图像还打开,请先打开图像!");return;}//获取图像宽和高int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();int i,j,k;int count[256]={0};//定义一个数组,用于存放灰度级个数 float p[256];//定义一个数组,用于存放灰度级出现频率//对图像进行直方图均衡化处理for(i=0;i<nh;i++)for(j=0;j<nw;j++){k=m_dib.m_pdata[i*nw+j];//计算灰度级个数count[k]++;}for(k=0;k<256;k++)p[k]=count[k]/(nw*nh*1.0f);float c[256]={0};float sum=0.0;int ngray[256];//新的灰度级for(k=0;k<256;k++)//计算累积频率{sum+=p[k];c[k]=sum;ngray[k]=(int)(255.0*c[k]+0.5);}for(i=0;i<nh;i++)for(j=0;j<nw;j++){k=m_dib.m_pdata[i*nw+j];m_dib.m_pdata[i*nw+j]=ngray[k];}{int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();for(int j=0;j<nh;j++)for(int i=0;i<nw;i++){BYTE temp=m_dib.m_pdata[j*nw+i];m_hist[temp]++;}}//将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果m_dib.UpdateData();m_bHist=true;//将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果 m_dib.UpdateData();//刷新屏幕Invalidate();}4、实验结果C++编程结果:。

数字图像处理期末考试题库

数字图像处理期末考试题库

数字图像处理期末考试题库某数字图像处理的主要内容及特点图像获取、图像变换、图像增强、图像恢复、图像压缩、图像分析、图像识别、图像理解(1)处理精度高,再现性好。

(2)易于控制处理效果。

(3)处理的多样性。

(4)图像数据量庞大。

(5)图像处理技术综合性强。

某图像增强:通过某种技术有选择地突出对某一具体应用有用的信息,削弱或抑制一些无用的信息。

图像增强不存在通用理论。

图像增强的方法:空间域方法和变换域方法。

某图像反转:S=L-1-r1.与原图像视觉内容相同2.适用于增强嵌入于图像暗色区域的白色或灰色细节。

某对数变换S=C某log(1+r)c为常数,r>=0作用与特点:对数变换将输入中范围较窄的低灰度值映射为输出中较宽范围的灰度值,同时,对输入中范围较宽的高灰度值映射为输出中较窄范围的灰度值。

对数函数的一个重要特征是可压缩像素值变化较大的图像的动态范围;某幂律(伽马)变换=c某(r+ɛ)ɤ伽马小于1时减小图像对比度,伽马大于1时增大对比度。

某灰度直方图:是数字图像中各灰度级与其出现的频数间的统计关系。

某直方图均衡化:直方图均衡化就是通过变换函数将原图像的直方图修正为均匀的直方图,即使各灰度级具有相同的出现频数,图象看起来更清晰。

直方图均衡化变换函数必须为严格单调递增函数。

直方图均衡化的特点:›1.能自动增强图像的对比度2.得到了全局均衡化的直方图,即均匀分布3.但其效果不易控制某直方图规定化(匹配):用于产生处理后有特殊直方图的图像的方法某空间滤波即直接对图像像素进行处理。

获得最佳滤波效果的唯一方法是使滤波掩模中心距原图像边缘的距离不小于(n-1)/2个像素。

某平滑滤波器用于模糊处理和减小噪声。

平滑线性空间滤波器的输出是:待处理图像在滤波器掩模邻域内的像素的简单平均值。

优点:减小了图像灰度的“尖锐”变化,故常用于图像降噪。

负面效应:模糊了图像的边缘,因为边缘也是由图像灰度的尖锐变化造成的。

空间均值处理的重要应用是,为了对感兴趣的物体得到一个粗略的描述而模糊一幅图像。

图像直方图的均衡化处理图的均衡化

图像直方图的均衡化处理图的均衡化

图像直⽅图的均衡化处理图的均衡化图像直⽅图的均衡化处理⼀,技术要求1.1,利⽤matlab提供的函数处理 (2)1.2,利⽤matlab⾃⾏编辑代码处理 (3)⼆,基本原理 (3)2.1,直⽅图的均衡化 (3)2.2,直⽅图的标准化 (3)三,建⽴模型描述 ......................................................................... 3~43.1,利⽤matlab提供的函数处理 (4)3.2,利⽤matlab⾃⾏编辑代码 (4)四,源程序代码 ............................................................................. 5~64.1,绘制图像直⽅图的代码 (5)4.2,绘制图像均衡化后直⽅图的代码 (5)4.3,显⽰均衡化后图像的代码 (6)五,调试过程及结论 ..................................................................... 6~85.1,在编辑窗⼝键⼊绘制直⽅图的源代码得到的输出结果为图2 (6)5.2,利⽤matlab函数绘制的图像直⽅图标准化的输出结果如图3..75.3,直⽅图均衡化输出结果如图4所⽰。

(8)六,⼼得体会 (9)七,参考⽂献 (9)图像直⽅图的均衡化处理⼀,技术要求1.1,利⽤matlab提供的函数处理利⽤matlab提供的函数画出⼀幅图像的直⽅图,对其进⾏均衡化和标准化处理,并⽐较均衡化(标准化)后图像和原图像的区别。

1.2,利⽤matlab⾃⾏编辑代码处理利⽤matlab⾃⾏编辑代码,实现⼀幅图像的直⽅图显⽰和均衡化的处理,同样⽐较处理前后两幅图像的区别,了解图像均衡化的效果和实际运⽤。

⼆,基本原理直⽅图是多种空域处理技术的基础。

它能有效的⽤于图像增强。

直方图均衡化

直方图均衡化

直⽅图均衡化今天学习了下直⽅图均衡化的原理。

先来看看维基百科上的⼀个例⼦: 从这张未经处理的灰度图可以看出,其灰度集中在⾮常⼩的⼀个范围内。

这就导致了图⽚的强弱对⽐不强烈。

直⽅图均衡化的⽬的,就是使得灰度分布尽可能平均地“填满”整个灰度空间(0~255),就是做到直⽅图的上界是⼀条平⾏于X轴的直线(理想化)。

有了这个⽬标之后,开始推导。

这个推导过程从连续函数出发。

第⼀步:建⽴⼀个从灰度r到s的映射s=T(r)第⼆步:将均衡化后的直⽅图的分布H B 表⽰成原图灰度分布H A 的函数 --> H B(s)=H A(r)/T(r),原理见下。

第三步:理想化的灰度分母应为常数,得T(r)=k*H A(r),不妨另:k=C/A o .(A o为所有像素数)第四步:两边同时积分(0->L),由密度函数的归⼀化条件得 : s=T(L)=C,因为s取值也是0->L,所以C=L。

第五步:把连续函数写成离散形式以适应计算机的处理。

(写出来⼤概就是这样,⾃⼰也能理解,但是总是感觉怪怪的) 可以看出,直⽅图均衡化只是将直⽅图进⾏了伸缩变换,或者说是⼀个搬移。

将变化律低的部分挤压,将变化率⾼的部分拉伸,得到⼀个两边变化陡峭中间平滑的灰度分布(单峰的话就很明显)。

可以看看维基百科上直⽅图均衡化之后的例⼦: 通过观察可以发现,由于中间部分灰度被拉伸了,灰度的取值变得不是很“连续”。

这个就是直⽅图均衡化的⼀个缺点吧。

(其实是离散的问题)———————————————————————————————————————————————————————————————————————————————闲着⽆聊搞了个最简单的直⽅图均衡化⼩程序,⼤家可以⾃⼰拿去试⼀下。

接下来的计划是做⾃适应直⽅图均衡化和对⽐对限制的直⽅图均衡化。

代码:#include <iostream>#include <string>#include <io.h>#include <opencv2/opencv.hpp>#include<math.h>#include<cv.h>using namespace std;using namespace cv;void main(int argc, char** argv){//变量定义//图⽚类IplImage *src , *dst;IplImage *histframesrc , *histframedst;CvSize size;//直⽅图类CvHistogram *histo_src , *histo_dst;int scale;float histmin,histmax;int bins=256;float range[]={0,255};float *ranges[]={range};//杂家int i,j,k,m,n; //循环变量……⽽已float s_r[256]; //S(r)映射函数//---------------------------------------------------------------src=cvLoadImage("11.jpg",0); //图⽚变量初始化cvShowImage("src",src);size=cvGetSize(src);dst=cvCreateImage(size,8,1);histo_src=cvCreateHist(1,&bins,CV_HIST_ARRAY,ranges); //直⽅图初始化histo_dst=cvCreateHist(1,&bins,CV_HIST_ARRAY,ranges);cvCalcHist(&src,histo_src,0,0); //计算直⽅图cvNormalizeHist(histo_src,1); //归⼀//累加,求S(r)映射s_r[0]=cvQueryHistValue_1D(histo_src,0);for(i=1;i<=255;i++){s_r[i]=s_r[i-1]+cvQueryHistValue_1D(histo_src,i);}//当然要把是S(r)归⼀到255啦for(i=0;i<=255;i++){s_r[i]=cvRound(s_r[i]*255);}//遍历图像并由sr关系进⾏直⽅图均衡化啦CvScalar s;for(m=0;m<size.height;m++){for(n=0;n<size.width;n++){s=cvGet2D(src,m,n);i=s.val[0];i=s_r[i];s.val[0]=i;cvSet2D(dst,m,n,s);}}//计算dst直⽅图cvCalcHist(&dst,histo_dst,0,0);cvNormalizeHist(histo_dst,1);//SHOWOFF⼀下啦cvShowImage("dst",dst);scale=1;//画出src和dst的直⽅图histframesrc=cvCreateImage( cvSize(bins*scale,256),8,1);histframedst=cvCreateImage( cvSize(bins*scale,256),8,1);//src的cvGetMinMaxHistValue(histo_src , &histmin , &histmax , 0 , 0 );for(int i = 0; i < bins; i++){/** 获得直⽅图中的统计次数,计算显⽰在图像中的⾼度 */float bin_val = cvGetReal1D(histo_src->bins,i);bin_val=bin_val*255/histmax;s.val[0]=cvRound(bin_val);cvRectangle(histframesrc,cvPoint(i*scale,256),cvPoint((i+1)*scale,256-bin_val),s,-1,8,0); }cvShowImage("src's hisogram",histframesrc);//dst的cvGetMinMaxHistValue(histo_dst , &histmin , &histmax , 0 , 0 );for(int i = 0; i < bins; i++){/** 获得直⽅图中的统计次数,计算显⽰在图像中的⾼度 */float bin_val = cvGetReal1D(histo_dst->bins,i);bin_val=bin_val*255/histmax;cout<<bin_val<<"\t";s.val[0]=cvRound(bin_val);cvRectangle(histframedst,cvPoint(i*scale,256),cvPoint((i+1)*scale,256-bin_val),s,-1,8,0); }cvShowImage("dst's hisogram",histframedst);//输出sr试⼀下for(i=0;i<=255;i++)cout<<s_r[i]<<"\n";for(;;)if(cvWaitKey(0)==27)break;}结果:(直⽅图变得平缓了但是中间部分变得稀疏了)。

直方图均衡化的MATLAB实现(遥感课程设计)

直方图均衡化的MATLAB实现(遥感课程设计)
r
s T r Pr r dr
0
(2.4)
其中,
P r dr 是 r 的累积分布函数,由于累积分布函数是 r 的函数,且从 0 到 1 单调递
0 r
r
增,所以变换函数即式(2.4)满足关于 T r 在 0 r 1 区间内单值单调增加,在 0 r 1 内有 0 T r 1 的两个条件。 对公式(2.4)中的 r 求导,有 ds / dr Pr r ,把求导结果代入式(2.3),则有:
2、图像直方图均衡化
直方图是反映一幅图像中的灰度级与出现这种灰度级的概率之间关系的统计图表。 直方
图的横坐标是灰度级 rk , 纵坐标是图像中具有该灰度级的像素个数或出现这个灰度级数的概 率 P rk 。直方图能直观地表示出图像具有某种灰度级的像素个数,是对图像灰度值分布情 总数, nk 为第 k 级灰度的像素数。 通过观察图像的灰度直方图, 就可以判断这幅图像的对比度和清晰度, 也可以掌握图像 的明暗程度。本文即采用直方图均衡化[11]的方法来对航拍图像进行增强处理。 设 r 和 s 分别表示归一化 (注: 归一化是指图像的灰度值通过某个比例变换后限制在[0,1] 之间)的图像灰度和经直方图修正后的图像灰度,即 0 r , s 1 。在 0,1 区间内的任何一 个 r 值都可产生一个 s 值,且有: s T r 。T r 为变换函数,满足:(1)在 0 r 1 区 间内是单调递增函数;(2)对于 0 r 1 ,有 0 T r 1 。条件(1)保证变换后的灰度 从黑到白的次序不变,条件(2)确保灰度变换后的像素处于允许的范围之内。从 s 到 r 的 反变换关系为: r T 况的整体描述。概率灰度直方图的计算公式为: P rk nk / N 。其中 N 为图像中的像素

图像处理——直方图均衡化

图像处理——直方图均衡化

图像处理——直⽅图均衡化图像处理——直⽅图均衡化⼀、直⽅图⼀、直⽅图 直⽅图就是之图像中各像素的统计值。

反映图象中每种灰度出现的频率。

直⽅图的性质:直⽅图就是之图像中各像素的统计值。

反映图象中每种灰度出现的频率。

直⽅图的性质:1)表征了图像的⼀维信息。

只反映图像中像素不同灰度值出现的次数(或频数)⽽未反映像素所在位置。

1)表征了图像的⼀维信息。

只反映图像中像素不同灰度值出现的次数(或频数)⽽未反映像素所在位置。

2)与图像之间的关系是多对⼀的映射关系。

⼀幅图像唯⼀确定出与之对应的直⽅图,但不同图像可能有相同的直⽅图。

2)与图像之间的关系是多对⼀的映射关系。

⼀幅图像唯⼀确定出与之对应的直⽅图,但不同图像可能有相同的直⽅图。

3)⼦图直⽅图之和为整图的直⽅图。

3)⼦图直⽅图之和为整图的直⽅图。

⼆、直⽅图均衡化⼆、直⽅图均衡化直⽅图均衡化处理的“中⼼思想”是把原始图像的灰度直⽅图从⽐较集中的某个灰度区间变成在全部灰度范围内的均匀分布。

直⽅图均衡化直⽅图均衡化处理的“中⼼思想”是把原始图像的灰度直⽅图从⽐较集中的某个灰度区间变成在全部灰度范围内的均匀分布。

直⽅图均衡化就是对图像进⾏⾮线性拉伸,重新分配图像像素值,使⼀定灰度范围内的像素数量⼤致相同。

直⽅图均衡化就是把给定图像的直⽅图分布改就是对图像进⾏⾮线性拉伸,重新分配图像像素值,使⼀定灰度范围内的像素数量⼤致相同。

直⽅图均衡化就是把给定图像的直⽅图分布改变成“均匀”分布直⽅图分布。

变成“均匀”分布直⽅图分布。

(I )直⽅图均衡化的过程:(I )直⽅图均衡化的过程:1)列出原始图像和变换后图像的灰度级(L 是灰度级的个数);1)列出原始图像和变换后图像的灰度级(L 是灰度级的个数);2)统计原图像中各灰度级的像素个数;2)统计原图像中各灰度级的像素个数;3)计算原始图像直⽅图P(i)=Ni/N ;3)计算原始图像直⽅图P(i)=Ni/N ;4)计算累计直⽅图P(j)=P(1) + P(2) + P(3) +…+ P(i);4)计算累计直⽅图P(j)=P(1) + P(2) + P(3) +…+ P(i);5)利⽤灰度值变换函数计算变换后的灰度值,并四舍五⼊取整;j=INT[(L-1)Pj+0.5]5)利⽤灰度值变换函数计算变换后的灰度值,并四舍五⼊取整;j=INT[(L-1)Pj+0.5]6)确定灰度变换关系i →j ,据此将原图像的灰度值f (m,n )=i 修正为g (m ,n )=j ;6)确定灰度变换关系i →j ,据此将原图像的灰度值f (m,n )=i 修正为g (m ,n )=j ;7)统计变换后各灰度级的像素个数Nj ;7)统计变换后各灰度级的像素个数Nj ;8)计算变换后图像的直⽅图Pj=Nj/N 8)计算变换后图像的直⽅图Pj=Nj/N(II )图像均衡化后的缺点:(II )图像均衡化后的缺点:1)变换后图像的灰度级减少,某些细节消失;1)变换后图像的灰度级减少,某些细节消失;2)某些图像,如直⽅图有⾼峰,经处理后对⽐度不⾃然的过分增强。

图像直方图均衡化

图像直方图均衡化

图像直⽅图均衡化1. 直⽅图均衡化介绍⾃我感觉书上讲的很清楚,直接把截图贴上了。

在进⾏直⽅图均值化的过程如下读⼊图像对每个通道分别统计像素值[0,255]出现的次数。

对每个通道分别求像素值[0,255]出现的概率,得到概率直⽅图。

对每个通道分别求像素值[0,255]概率的前缀和,得到累计直⽅图。

对每个通道根据累计直⽅图分别求像素映射函数。

对每个通道完成每个像素点的映射。

输出直⽅图均衡化的图像。

2.代码(MATLAB)1 %直⽅图均衡化2 I = imread('D:/picture/girl.jpg');3 I=rgb2gray(I);%如果某些图⽚不是⼆维灰度图像要加上这句,否则imhist报错4 [height,width] = size(I);5 figure6 subplot (221)7 imshow(I);%显⽰原始图像8 subplot(222)9 imhist(I)%显⽰原始图像直⽅图(注释⼀)1011 %进⾏像素灰度统计12 NumPixel = zeros(1,256);%统计各灰度数⽬,共256个灰度级13for i = 1:height14for j = 1:width15 NumPixel (I(i,j)+1)=NumPixel(I(i,j)+1)+1;%对应灰度值像素点数量增加⼀9(注释⼆)16 end17 end18 %计算灰度分布密度19 ProbPixel = zeros(1,256);20for i =1:25621 ProbPixel(i) = NumPixel(i)/(height*width*1.0);%该灰度值的像素个数除于总的像素点的个数22 end23 %计算累计直⽅图分布24 CumuPixel = zeros(1,256);25for i = 1:256;26if i == 127 CumuPixel(i) = ProbPixel(i);28else29 CumuPixel(i) = CumuPixel(i-1)+ProbPixel(i);%进⾏累加30 end31 end32 %累计分布取整3334 CumuPixel = uint8(256* CumuPixel);%也就是原来图像的灰度级根据累加概率的值变成了新的灰度级(注释三)35 %对灰度值进⾏映射(均衡化)36for k =1:height37for l =1:width38 I(k,l)= CumuPixel(I(k,l)+1);%映射,加⼀的⽬的是使下标从⼀开始39 end40 end41 subplot(223)42 imshow(I)%显⽰原始图像43 subplot(224)44 imhist(I)%显⽰原始图像直⽅图运⾏结果如下注:直⽅图x轴是图像的灰度值,y轴是在该灰度值的像素的个数分析:观察图⽚我们发现对于原始图⽚整体颜⾊偏⽩,对⽐度不强,直⽅图分布偏于右边。

图片直方图均衡化

图片直方图均衡化

图⽚直⽅图均衡化对于输⼊像素点r和输出像素点s都在灰度级 [0,L-1]之间,r = 0 代表⿊⾊, r = L - 1代表⽩⾊。

对于r和s的变换形式为:r和s满⾜⼀下条件:利⽤反函数来从s推r时,有以下定义:r和s满⾜条件:条件a是为了保证输出的灰度级不少于输⼊,这是为了防⽌⼆义性。

条件b是为了保证输出的灰度范围和输⼊的灰度范围相同。

条件a`也是为了保证s到r 也是⼀⼀对应的,防⽌⼆义性。

实验中采⽤8bit整性的像素分布,不⼀定满⾜这个情况。

在实验中会类似左边的图像,出现多个输⼊的r,输出同⼀个s值。

⽽在理论的约束上应该和右图相似,r与s⼀⼀对应。

对于⼀副灰度图像,和分别代表输⼊图像和输出图像的像素点的概率分布,我们简称为PDF。

对于已知的和满⾜公式:(1)直⽅图均衡化的采⽤的公式如下:(2)其中w是积分假变量,L-1是最⼤的灰度级。

为什么要这么做呢。

由莱布尼兹准则,我们知道上限的定积分的导数是被积函数在该上限的值。

(3)我们将的结果带⼊(1)中,(4)2 结论使⽤(2)公式后,输出图像的像素点s分布是均匀的,PDF为1/(L-1)。

3 离散直⽅图均衡化采⽤公式对于离散的直⽅图均衡化采⽤的公式为:(5)其中MN是总的像素点个数编码实现1 统计输⼊的灰度图像的像素信息void calHistInfo(const Mat& src, vector<unsigned int>& calVec, vector<unsigned int >& calVecBefor,unsigned int LMax){int width = src.cols;int height = src.rows;int piexl = 0;for (int h = 0; h < height; h++){for (int w = 0; w < width; w++) {piexl = (int)src.at<uchar>(h, w);calVec[round(piexl)] += 1;}}calVecBefor[0] = calVec[0];for (int i = 1; i < calVec.size(); i++){calVecBefor[i] = calVecBefor[i - 1] + calVec[i];}cout << "统计完毕" << endl;}这⾥我⽤了两个vector数组calVec 和calVecBefor ,calVec是⽤于记录每个灰度级别的像素个数,calVecBefor是记录在当前像素r个数和r之前的像素之和。

实验一直方图均衡化-推荐下载

实验一直方图均衡化-推荐下载
printf("could not find the image\n"); //灰度图图像信息 length=img->height; width=img->width; step=img->widthStep; channel=img->nChannels; data=(uchar*)img->imageData;
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术通关,1系电过,力管根保线据护敷生高设产中技工资术0艺料不高试仅中卷可资配以料置解试技决卷术吊要是顶求指层,机配对组置电在不气进规设行范备继高进电中行保资空护料载高试与中卷带资问负料题荷试22下卷,高总而中体且资配可料置保试时障卷,各调需类控要管试在路验最习;大题对限到设度位备内。进来在行确管调保路整机敷使组设其高过在中程正资1常料中工试,况卷要下安加与全强过,看2度并22工且22作尽22下可22都能2可地护1以缩关正小于常故管工障路作高高;中中对资资于料料继试试电卷卷保破连护坏接进范管行围口整,处核或理对者高定对中值某资,些料审异试核常卷与高弯校中扁对资度图料固纸试定,卷盒编工位写况置复进.杂行保设自护备动层与处防装理腐置,跨高尤接中其地资要线料避弯试免曲卷错半调误径试高标方中高案资等,料,编5试要写、卷求重电保技要气护术设设装交备备4置底高调、动。中试电作管资高气,线料中课并3敷试资件且、设卷料中拒管技试试调绝路术验卷试动敷中方技作设包案术,技含以来术线及避槽系免、统不管启必架动要等方高多案中项;资方对料式整试,套卷为启突解动然决过停高程机中中。语高因文中此电资,气料电课试力件卷高中电中管气资壁设料薄备试、进卷接行保口调护不试装严工置等作调问并试题且技,进术合行,理过要利关求用运电管行力线高保敷中护设资装技料置术试做。卷到线技准缆术确敷指灵设导活原。。则对对:于于在调差分试动线过保盒程护处中装,高置当中高不资中同料资电试料压卷试回技卷路术调交问试叉题技时,术,作是应为指采调发用试电金人机属员一隔,变板需压进要器行在组隔事在开前发处掌生理握内;图部同纸故一资障线料时槽、,内设需,备要强制进电造行回厂外路家部须出电同具源时高高切中中断资资习料料题试试电卷卷源试切,验除线报从缆告而敷与采设相用完关高毕技中,术资要资料进料试行,卷检并主查且要和了保检解护测现装处场置理设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档