编程实现直方图均衡化

合集下载

直方图均衡化代码

直方图均衡化代码

直方图均衡化的代码clear all%一,图像的预处理,读入彩色图像将其灰度化PS=imread('2.jpg'); %读入JPG彩色图像文件imshow(PS) %显示出来title('输入的彩色JPG图像')imwrite(rgb2gray(PS),'PicSampleGray.bmp'); %将彩色图片灰度化并保存PS=rgb2gray(PS); %灰度化后的数据存入数组%二,绘制直方图[m,n]=size(PS); %测量图像尺寸参数GP=zeros(1,256); %预创建存放灰度出现概率的向量for k=0:255GP(k+1)=length(find(PS==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置endfigure,bar(0:255,GP,'g') %绘制直方图title('原图像直方图')xlabel('灰度值')ylabel('出现概率')%三,直方图均衡化S1=zeros(1,256);for i=1:256for j=1:iS1(i)=GP(j)+S1(i); %计算SkendendS2=round((S1*256)+0.5); %将Sk归到相近级的灰度for i=1:256GPeq(i)=sum(GP(find(S2==i))); %计算现有每个灰度级出现的概率endfigure,bar(0:255,GPeq,'b') %显示均衡化后的直方图title('均衡化后的直方图')xlabel('灰度值')ylabel('出现概率')%四,图像均衡化PA=PS;for i=0:255PA(find(PS==i))=S2(i+1); %将各个像素归一化后的灰度值赋给这个像素endfigure,imshow(PA) %显示均衡化后的图像title('均衡化后图像') imwrite(PA,'PicEqual.bmp');。

直方图均衡化实例

直方图均衡化实例

实验一直方图的均衡化一.实验目的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的上机环境变得更加的熟悉,并对直方图均衡化处理图像和中值滤波也有了一定的理解。

直方图均衡化、对数变换、伽马变换(python完成)

直方图均衡化、对数变换、伽马变换(python完成)

直⽅图均衡化、对数变换、伽马变换(python完成)1.直⽅图均衡化(使⽤python完成):①:计算图⽚原始的灰度分布:def Grayscale_Probability(img): #输⼊img是读取后的灰度图数据prob = torch.zeros(256)for i in img:for j in i:prob[j] += 1h, w = img.shape #图⽚⼤⼩为753*759return prob/(w*h) #返回每个灰度值的概率②:根据灰度概率计算累计概率并进⾏直⽅图均衡化:def Equalization(img,prob):for i in range(1,256): #先进⾏累计概率的计算prob[i] = prob[i]+prob[i-1]#进⾏像素值映射,256个灰度级,进⾏四舍五⼊,⽤torch.round(255 * prob[i])也可img_map = [int(255 * prob[i]+0.5) for i in range(256)]h, w = img.shapefor ri in range(h):#替换原图像灰度for ci in range(w):img[ri, ci] = img_map[img[ri, ci]]return img2.对数变换:对数变换能将图像中,范围较窄的低灰度值映射为范围较宽的灰度值,或将范围较宽的⾼灰度值映射为范围较窄的灰度值,适⽤于扩展图像中的暗像素值,同时压缩更⾼灰度级的值。

将图象的灰度值进⾏log变换,表达式为:,其中,r表⽰原始图像的灰度级,s表⽰变换后的灰度级,c为⼀常数:def Logtrans(img,c):ir, ic = img.shaperes = np.zeros((ir,ic),dtype=np.uint8)for imgr in range(ir):for imgc in range(ic):res[imgr,imgc] =np.uint8(c * np.log(1.0 + img[imgr,imgc]) + 0.5)return res注意:经过log变换后灰度值从0-255变成了0-5.5,需要在8⽐特的显⽰器中进⾏显⽰,则需要将其规范化到(0,255)中,我这⾥将c设为46来简单替代了此操作。

数字图像处理实验3图像直方图与均衡化

数字图像处理实验3图像直方图与均衡化

实验三图像直方图与均衡化一、实验原理离散图像用直方图表示该图像中各个不同灰度级像素出现的相对频率。

灰度直方图是简单且实用的工具,对图像的采集、处理和分析都可以有效地利用直方图。

灰度直方图反映了数字图像中的每一灰度级与其出现的频率间的关系。

直方图均衡化是通过对原图形进行某种变换,使图像的直方图变为均匀分布的直方图,从而达到增强的效果。

二、实验设备MATLAB软件三、实现程序:pic=imread('football.jpg');imshow(pic)imwrite(rgb2gray(PS),'football.bmp');pic=rgb2gray(pic);figure,imshow(pic)[m,n]=size(pic);S0=zeros(1,256);for k=0:255S0(k+1)=length(find(pic==k))/(m*n);endfigure,bar(0:255,S0,'g')S1=zeros(1,256);for i=1:256for j=1:iS1(i)=S0(j)+S1(i);endendS2=round(S1*256);for i=1:256S0eq(i)=sum(S0(find(S2==i)));endfigure,bar(0:255,S0eq,'b')Img=pic;for i=0:255Img (find(pic==i))=S2(i+1);endfigure,imshow(Img);四、运行结果:原图像的直方图均衡化后图像的直方图原图像均衡化后的图像。

python数字图像处理实现直方图与均衡化

python数字图像处理实现直方图与均衡化

python数字图像处理实现直⽅图与均衡化在图像处理中,直⽅图是⾮常重要,也是⾮常有⽤的⼀个处理要素。

在skimage库中对直⽅图的处理,是放在exposure这个模块中。

1、计算直⽅图函数:skimage.exposure.histogram(image,nbins=256)在numpy包中,也提供了⼀个计算直⽅图的函数histogram(),两者⼤同⼩义。

返回⼀个tuple(hist, bins_center), 前⼀个数组是直⽅图的统计量,后⼀个数组是每个bin的中间值import numpy as npfrom skimage import exposure,dataimage =data.camera()*1.0hist1=np.histogram(image, bins=2) #⽤numpy包计算直⽅图hist2=exposure.histogram(image, nbins=2) #⽤skimage计算直⽅图print(hist1)print(hist2)输出:(array([107432, 154712], dtype=int64), array([ 0. , 127.5, 255. ]))(array([107432, 154712], dtype=int64), array([ 63.75, 191.25]))分成两个bin,每个bin的统计量是⼀样的,但numpy返回的是每个bin的两端的范围值,⽽skimage返回的是每个bin的中间值2、绘制直⽅图绘图都可以调⽤matplotlib.pyplot库来进⾏,其中的hist函数可以直接绘制直⽅图。

调⽤⽅式:复制代码代码如下:n, bins, patches = plt.hist(arr, bins=10, normed=0, facecolor='black', edgecolor='black',alpha=1,histtype='bar')hist的参数⾮常多,但常⽤的就这六个,只有第⼀个是必须的,后⾯四个可选arr: 需要计算直⽅图的⼀维数组bins: 直⽅图的柱数,可选项,默认为10normed: 是否将得到的直⽅图向量归⼀化。

数字图像的直方图均衡化(CC++源代码)

数字图像的直方图均衡化(CC++源代码)

数字图像的直方图均衡化(C/C++源代码)2008-11-02 00:40数字图像的直方图均衡化是常用的图像增强方法,因为均衡化是自动完成的,无需人工干预,而且常常得到比较满意的结果。

下面的程序是利用OPENCV提供的函数,实现这个功能。

需要OPENCV B4.0的支持,在VC6下编译通过。

//// perform histgram equalization for single channel image// AssureDigit Sample code//#include "cv.h"#include "highgui.h"#define HDIM 256 // bin of HIST, default = 256int main( int argc, char** argv ){IplImage *src = 0, *dst = 0;CvHistogram *hist = 0;int n = HDIM;double nn[HDIM];uchar T[HDIM];CvMat *T_mat;int x;int sum = 0; // sum of pixels of the source image 图像中象素点的总和double val = 0;if( argc != 2 || (src=cvLoadImage(argv[1], 0)) == NULL) // force to gray imagereturn -1;cvNamedWindow( "source", 1 );cvNamedWindow( "result", 1 );// calculate histgram 计算直方图hist = cvCreateHist( 1, &n, CV_HIST_ARRAY, 0, 1 );cvCalcHist( &src, hist, 0, 0 );// Create Accumulative Distribute Function of histgramval = 0;for ( x = 0; x < n; x++){val = val + cvGetReal1D (hist->bins, x);nn[x] = val;}// Compute intensity transformation 计算变换函数的离散形式 sum = src->height * src->width;for( x = 0; x < n; x++ ){T[x] = (uchar) (255 * nn[x] / sum); // range is [0,255] }// Do intensity transform for source imagedst = cvCloneImage( src );T_mat = cvCreateMatHeader( 1, 256, CV_8UC1 );cvSetData( T_mat, T, 0 );// directly use look-up-table function 直接调用内部函数完成look-up-table 的过程cvLUT( src, dst, T_mat );cvShowImage( "source", src );cvShowImage( "result", dst );cvWaitKey(0);cvDestroyWindow("source");cvDestroyWindow("result");cvReleaseImage( &src );cvReleaseImage( &dst );cvReleaseHist ( &hist );return 0;}。

直方图均衡化算法代码

直方图均衡化算法代码

直⽅图均衡化算法代码做了⼀天,都是⿊屏,最后发现,竟然是⼀个局部变量引起。

基本是分3步,这个是在灰度图像下实现均衡化直⽅图。

彩⾊下直接均衡化研究出来再补上。

第⼀步:计算初始直⽅图,即记录每⼀个像素出现次数。

for(int y =0; y < m_image->GetHeight(); y++){for(int x =0; x < m_image->GetWidth();x++){COLORREF rgb = m_image->GetPixel(x,y);int rValue = GetRValue(rgb); //记录每⼀个像素出现次数。

hist[rValue]++;}}第⼆步:由上⾯得到的初始直⽅图计算归⼀化直⽅图和累积直⽅图int hist[256]= {0};double phist[256];for (int i =0; i <=255 ;i++){phist [i]= (double) hist[i]/ (m_image->GetHeight() * m_image->GetWidth()); //归⼀化直⽅图即每个像素出现概率}double dSum[256]= {0.0};for(int i =0; i<=255;i++){if(i !=0){dSum[i]= dSum[i-1]+ phist[i];}else//累积直⽅图{dSum[i]= phist[i];}}第三步:求均衡化映射(旧图->新图)关系,并写⼊新图像for(int y =0; y < m_image->GetHeight(); y++){for(int x =0; x < m_image->GetWidth();x++){COLORREF rgb = m_image->GetPixel(x,y);int rValue = GetRValue(rgb);rValue = Mapping[rValue]; //根据映射关系实现均衡化rgb = RGB(rValue,rValue,rValue);m_image->SetPixel(x,y,rgb);}}。

编程实现直方图均衡化

编程实现直方图均衡化

编程实现直方图均衡化一、实验目的掌握直方图均衡化的原理,和其步骤,了解直方图均衡化的作用、效果。

二、实验要求实现对任意图像进行直方图均衡化。

三、实验原理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.分析在对灰度级进行映射转换时一定要进行四舍五入运算,否则会有误差。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编程实现直方图均衡化
一、实验目的
掌握直方图均衡化的原理,和其步骤,了解直方图均衡化的作用、效果。

二、实验要求
实现对任意图像进行直方图均衡化。

三、实验原理
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. 结果
程序界面
()01k
j
a a j L h x N =-

2.分析
在对灰度级进行映射转换时一定要进行四舍五入运算,否则会有误差。

七、 源代码
1.将原灰度级映射到新值: /// <summary>
/// 均衡化 /// </summary>
/// <param name="pixcount"></param>像素总数 /// <param name="levelcount"></param>灰度级别总数 /// <param name="totalpixcount"></param>累计像素统计值 /// <returns></returns>转化后新灰度级
public static int Equalization(int pixcount,int levelcount, int totalpixcou nt)
{
double dvalue = 0; int value = 0;
dvalue = ((levelcount - 1.0) / pixcount) * totalpixcount;///(L-1)/N*TotalCount 映射公式
if (dvalue * 10 % 10 >= 5) { //进行4舍五入 dvalue += 1; }
value =(int ) dvalue; return
value;
}
2.统计转换后的灰度值频率数据:
///<summary>
///获取DN值
///</summary>
///<returns></returns>
public Boolean GetDNCount()
{
htInputDNCount.Clear();
htOutputDNCount.Clear();//清除原来数据
if (file==null)
{
return false;
}
if(strInterLeave=="bsq")
{//通过
GetDNCountByBSQ();
}
else if (strInterLeave=="bip")
{
GetDNCountByBIP();
}
else if (strInterLeave == "bil")
{
GetDNCountByBIL();
}
double fmax = Double.MinValue, fmin = Double.MaxValue;//最小值赋最大值,最大值赋最小值
foreach (var item in htInputDNCount.Keys)
{//获取最大最小值
if (fmax<(double)item)
{//获取最大值
fmax = (double)item;
}
if (fmin >(double)item)
{//获取最小值
fmin =(double)item;
}
}
dMinValue = fmin;
dMaxValue = fmax;
// System.Console.WriteLine("max:"+dMaxValue.ToString()+" min:"+dMi nValue);
foreach (var item in htInputDNCount.Keys)
{//计算加入值
double value = (int)(ImageStretch.Linear(0,255,fmin,fmax,Convert.To Double(item)));//线性拉伸
if (htOutputDNCount.Contains(value))
{ //当存在该值时
int dncount = (int)htOutputDNCount[value];
dncount += (int)htInputDNCount[item]; //数量加1
htOutputDNCount[value] = dncount;
}
else
{//不存在该值时,直接加入
htOutputDNCount.Add(value,(int)htInputDNCount[item] );
}
}
if (this.stretchway == "均衡化(equalization)")
{
Hashtable ht = new Hashtable();
foreach (var item in htOutputDNCount.Keys)
{//计算加入值
int totalpixcount = (int)htOutputDNCount[item];
foreach (var key in htOutputDNCount.Keys)
{
if ((double)key<(double)item)
{
totalpixcount+= (int)htOutputDNCount[key];
}
}
double value = (int)(ImageStretch.Equalization(this.TotalCount, 256,totalpixcount));//均衡化
if (ht.Contains(value))
{ //当存在该值时
int dncount = (int)ht[value];
dncount += (int)htOutputDNCount[item]; //数量相加
ht[value] = dncount;
System.Console.WriteLine(value.ToString()+":"+dncount.ToStr ing());
}
else
{//不存在该值时,直接加入
ht.Add(value, (int)htOutputDNCount[item]); }
}
htOutputDNCount.Clear();
htOutputDNCount = ht;
}
return true;
}。

相关文档
最新文档