编程实现直方图均衡化

合集下载

直方图均衡化代码

直方图均衡化代码

直方图均衡化的代码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.分析在对灰度级进行映射转换时一定要进行四舍五入运算,否则会有误差。

直方图均衡化的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 为图像中的像素

直方图均衡化代码

直方图均衡化代码
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/*************************************************************************
void CMyDIPView::OnDraw(CDC* pDC)
{
CMyDIPDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_hDIB == NULL)
return ;
// TODO: add draw code for native data here
直方图均衡子函数
************************************************************************/
BOOL WINAPI InteEqualize(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
::PaintDIB(pDC->m_hDC, &rect, pDoc->m_hDIB, &rcDIB, pDoc->m_palDIB);
}
/////////////////////////////////////////////////////////////////////////////
//DEL
//DEL // 获取文档
//DEL CMyDIPDoc* pDoc = GetDocument();

直方图均衡化原理及编码实现

直方图均衡化原理及编码实现
plotHist1D(src, srcHistImg, CV_RGB(100, 100, 100));
// 画直方图
cvNamedWindow("srcHist");
cvShowImage("srcHist", srcHistImg);
// 1.计算直方图
int bins = DEPTH;
int sizes[] = {bins};
所以:

s = T() =
∫ () = C()
0 0
其中
1
P() =
∫ ()
A0 0
为了使 s 的取值范围为[0, ]:
C=L
由此得,使直方图均衡化的灰度变换函数是概率分布函数。
在离散情况下
s = T(r) = ( )
其中
k
( ) = ∑
// 说明:直方图参考例程
// 作者:Mark
// 时间:6.4.2011
/**********************************************************/
#include <cv.h>
#include <highgui.h>
#include "histogram.h"
plotHist1D(dst, dstHistImg, CV_RGB(100, 100, 100));
cvNamedWindow("dstHist");
cvShowImage("dstHist", dstHistImg);
cvWaitKey(0);
cvReleaseImage(&src);

python实现直方图均衡化,理想高通滤波与高斯低通滤波

python实现直方图均衡化,理想高通滤波与高斯低通滤波

python实现直⽅图均衡化,理想⾼通滤波与⾼斯低通滤波写在前⾯HIT⼤三上学期视听觉信号处理课程中视觉部分的实验⼆,经过和学长们实验的对⽐发现每⼀级实验要求都不⼀样,因此这⾥标明了是2019年秋季学期的视觉实验⼆。

由于时间紧张,代码没有进⾏任何优化,实验算法仅供参考。

实验要求1. 实现图像直⽅图均衡化,要求显⽰均衡化前、后直⽅图以及均衡化后图像。

2. 对单通道图像进⾏DFT变换,要求显⽰幅度图和相位图,并设计理想⾼通滤波器和⾼斯低通滤波器对图像进⾏频域滤波,并显⽰滤波之后的图像。

注:除DFT和IDFT外,不允许调库实验代码代码⾸先贴在这⾥,仅供参考⾸先是实现图像直⽅图均衡化的代码from ReadBmp import ReadBmpimport matplotlib.pyplot as pltimport numpy as npfilename1 = "1.bmp"bmp = ReadBmp(filename1)bmp.gray()# 统计各像素点数h = np.array([0 for i in range(256)])h1 = []for pixel in bmp.data:h[pixel[0]] = h[pixel[0]] + 1h1.append(pixel[0])# 画出原先的直⽅图plt.subplot(1,2,1)plt.hist(h1, bins = 256)# 归⼀化hs = h / len(bmp.data)# 计算累计分布hp = np.array([0.0 for i in range(256)])for i in range(256):hp[i] = np.round(np.sum(hs[0:i+1]) * 255)T = hp.astype('uint8')# 创建新图像,并统计新图像的各个像素点的个数hn = np.array([0 for i in range(256)])h2 = []for pixel in bmp.data:s = T[pixel[0]]pixel[0] = spixel[1] = spixel[2] = shn[pixel[0]] = hn[pixel[0]] + 1h2.append(s)bmp.creataBmp("2.bmp")# 画出新图像的直⽅图plt.subplot(1,2,2)plt.hist(h2, bins = 256)plt.show()其中读取bmp图像的程序是我⾃⼰写的,这⾥不再赘述(直接调⽤了实验⼀写好的bmp⽂件读取程序,具体代码见github)然后是理想⾼通滤波和⾼斯低通滤波的程序import numpy as npimport cv2import matplotlib.pyplot as pltdef IdealHighPassFiltering(f_shift):# 设置滤波半径D0 = 8# 初始化m = f_shift.shape[0]n = f_shift.shape[1]h1 = np.zeros((m, n))x0 = np.floor(m/2)y0 = np.floor(n/2)for i in range(m):for j in range(n):D = np.sqrt((i - x0)**2 + (j - y0)**2)if D >= D0:h1[i][j] = 1result = np.multiply(f_shift, h1)return resultdef GaussLowPassFiltering(f_shift):# 设置滤波半径D0 = 8# 初始化m = f_shift.shape[0]n = f_shift.shape[1]h1 = np.zeros((m, n))x0 = np.floor(m/2)y0 = np.floor(n/2)for i in range(m):for j in range(n):D = np.sqrt((i - x0)**2 + (j - y0)**2)h1[i][j] = np.exp((-1)*D**2/2/(D0**2))result = np.multiply(f_shift, h1)return resultimg =cv2.imread('1.bmp',0)f=np.fft.fft2(img)f_shift=np.fft.fftshift(f)# 幅度图s= np.log(abs(f_shift))# 相位图p= abs(np.angle(f_shift))plt.subplot(2,2,1)plt.imshow(s, 'gray')plt.subplot(2,2,2)plt.imshow(p, 'gray')# 理想⾼通滤波IHPF = IdealHighPassFiltering(f_shift)new_f1 = np.fft.ifftshift(IHPF)new_image1 = np.uint8(np.abs(np.fft.ifft2(new_f1)))plt.subplot(2,2,3)plt.imshow(new_image1, 'gray')# ⾼斯低通滤波GLPF = GaussLowPassFiltering(f_shift)new_f2 = np.fft.ifftshift(GLPF)new_image2 = np.uint8(np.abs(np.fft.ifft2(new_f2)))plt.subplot(2,2,4)plt.imshow(new_image2, 'gray')plt.show()实验结果实验结果的图像如下图所⽰这是直⽅图均衡化的运⾏结果,其中左图是做直⽅图均衡化前对像素统计的直⽅图,右图是做直⽅图均衡化后对像素统计的直⽅图这是画出图像的幅度图和相位图,对图像做理想⾼通滤波和⾼斯低通滤波的结果,其中1是幅度图,2是相位图,3是理想⾼通滤波的结果,4是⾼斯低通滤波的结果要点讲解关于实验算法的⼤致流程,已在程序中⽤注释标明,这⾥只记录需要注意的地⽅1. 在直⽅图均衡化中,要注意直⽅图函数的⽤法,该函数可以对输⼊的矩阵中的数值进⾏⾃动的分类,⽽不⽤⼿动分好之后再⽤直⽅图函数去画,之前没有仔细看该函数的⽤法,导致找了好长时间没找到问题。

MATLAB直方图均衡化代码

MATLAB直方图均衡化代码
se all
I = imread('C:\Documents and Settings\dmt\桌面\实习\图像\灰度图像\lenna.bmp')
imshow(I);
imhist(I);
直方图和直方图均衡的Matlab完整程序 2010-06-04 15:43:10
title('灰度化后的图像')
%二,绘制直方图
[m,n]=size(PS); %测量图像尺寸参数
GP=zeros(1,256); %预创建存放灰度出现概率的向量
for k=0:255
y(i,j)=bmap(I(i,j)+1);
end
end
y=uint8(y);
figure;
imshow(y);
clear all;
I = imread('1.jpg');
I=rgb2gray(I); %灰度化
%绘制直方图
[m,n]=size(I);
GP=zeros(1,256);
for k=0:255
GP(k+1)=length(find(I==k))/(m*n); %计算每级灰度出现的概率,将其存入GP
end
%三,直方图均衡化
S1=zeros(1,256);
for i=1:256
temp=0;
for j=1:i
temp=temp+hf(j);
end
bmap(i)=floor(temp*255/(m*n));
end
y=zeros(m,n);
for i=1:m
for j=1:n

直方图均衡化matlab代码

直方图均衡化matlab代码

图片采用了维基百科直方图均衡化中的图片保存为文件名test0.jpg直方图均衡化的原理参考《数字图像处理第三版(冈萨雷斯)》第75页公式3.3-8(主要就是一个公式)代码如下:imgdat0=imread('test0.jpg');%读图[r,c]=size(imgdat0);%图像尺寸PixelNum=r*c;%图像尺寸distribute=zeros(1,256);%原始直方图统计for i=1:PixelNumpos=imgdat0(i)+1;%加1是因为matlab索引从1开始而不是从0开始distribute(pos)=distribute(pos)+1;%pos为像素值,范围0-255/1-256enddistribute=distribute/PixelNum;%原始直方图统计convertarray=zeros(1,256);%像素转换对应tempadd=0;%累加计算使用for i=1:255%计算像素转换对应公式tempadd=tempadd+distribute(i);convertarray(i)=uint8(255*tempadd);endrimgdat0=uint8(zeros(r,c));%计算结果图像for i=1:PixelNumrimgdat0(i)=convertarray(imgdat0(i));%像素值转换end%显示figureimshow(imgdat0)figureimshow(rimgdat0)figurebar(distribute)rdistribute=zeros(1,256);%计算结果直方图统计for i=1:PixelNumpos=rimgdat0(i)+1;rdistribute(pos)=rdistribute(pos)+1;endfigurebar(rdistribute)原图结果图计算前后的直方图。

C语言实现直方图均衡化

C语言实现直方图均衡化

C语⾔实现直⽅图均衡化直⽅图均衡化部分是⽤c语⾔写的,最后⽤opencv显⽰原图像,处理后图像以及原图和处理后图的灰度直⽅图。

虽然做出来了,均衡化效果还可以,但不知道为什么处理后图像中有三条⽩线,真⼼搞不懂,有看出来问题的⼤神⿇烦留⾔告诉我,谢谢。

(终于知道哪出问题了,原来是每⾏字节数求错了,改为LineByte=(width*8/8+3)/4*4;即可。

)下⾯是代码:#include "stdafx.h"#include<stdio.h>#include<windows.h>#include<opencv2\highgui\highgui.hpp>#include<opencv2\core\core.hpp>#include<cv.h>int main(void){int width;//图像宽度int height;//图像⾼度RGBQUAD *pColorTable;unsigned char *pBmpBuf,*pBmpBuf1;BITMAPFILEHEADER bfhead;BITMAPINFOHEADER bihead;FILE *fp1=fopen("e:\\picture\\dog.bmp","rb");if(fp1==0)return 0;fread(&bfhead,14,1,fp1);fread(&bihead,40,1,fp1);width=bihead.biWidth;height=bihead.biHeight;pColorTable=new RGBQUAD[256];fread(pColorTable,4,256,fp1);int LineByte=0;LineByte=(width*1/4+1)*4;<span style="white-space:pre"> </span>//LineByte=(width*8/8+3)/4*4;pBmpBuf = new unsigned char[LineByte*height];fread(pBmpBuf,LineByte*height,1,fp1);fclose(fp1);pBmpBuf1=new unsigned char[LineByte*height]; //⽤于存储均值化后的图像数据//统计每个灰度级像素点的个数int N[256]={0};for(int i=0;i<height;i++)for(int j=0;j<width;j++){unsigned char *pb1,*pb2;pb1=pBmpBuf+i*LineByte+j;N[*pb1]++;pb2=pBmpBuf1+i*LineByte+j;*pb2=*pb1;}/*for(int i=0;i<256;i++ )printf("%d ",N[i]);*///统计最⼩与最⼤灰度值int minGrayValue=255;int maxGrayValue=0;for(int i=0;i<height;i++)for(int j=0;j<width;j++){unsigned char *pb;pb=pBmpBuf+i*LineByte+j;if(*pb>maxGrayValue)maxGrayValue=*pb;else if(*pb<minGrayValue)minGrayValue=*pb;}printf("%d ,%d\n",minGrayValue,maxGrayValue);//输出最⼤与最⼩灰度值int x=maxGrayValue-minGrayValue+1;float *p;p=new float[x];for(int i=0;i<x;i++){*(p+i)=(float)N[i]/(float)(width*height); //*(p+i)中存放的是灰度级为i的像素在整幅图像中出现//的概率(即*(p+i)i=0,1,2,3...中存放的就是这幅图像归⼀化后的直⽅图)}float *c;c=new float[x]; //定义c,⽤来存放累积的归⼀化直⽅图for(int i=0;i<x;i++) //对c进⾏初始化{*(c+i)=0;}for(int i=0;i<x;i++){for(int j=0;j<=i;j++){*(c+i)+=*(p+j);}}for(int i=0;i<height;i++)for(int j=0;j<width;j++){unsigned char *pb;pb=pBmpBuf1+i*LineByte+j;*pb=*(c+*pb)*(maxGrayValue-minGrayValue)+minGrayValue;}FILE *fp2=fopen("junhenghua.bmp","wb");fwrite(&bfhead,14,1,fp2);fwrite(&bihead,40,1,fp2);fwrite(pColorTable,4,256,fp2);fwrite(pBmpBuf1,LineByte*height,1,fp2);fclose(fp2);//显⽰原图与处理后的图像IplImage *src1=cvLoadImage("e:\\picture\\dog.bmp");IplImage *src2=cvLoadImage("junhenghua.bmp");cvNamedWindow("原图");cvNamedWindow("处理后图");cvShowImage("原图",src1);cvShowImage("处理后图",src2);//显⽰原图像与处理后图像的灰度直⽅图int size=256;float range[]={0,255};float *ranges[]={range};CvHistogram *hist1=cvCreateHist(1,&size, CV_HIST_ARRAY,ranges,1);//创建⼀维直⽅图,CvHistogram *hist2=cvCreateHist(1,&size, CV_HIST_ARRAY,ranges,1);IplImage* gray1=cvCreateImage(cvGetSize(src1),8,1);IplImage* gray2=cvCreateImage(cvGetSize(src2),8,1);cvCvtColor(src1,gray1,CV_BGR2GRAY);cvCvtColor(src2,gray2,CV_BGR2GRAY);//vCvtColor(...),是Opencv⾥的颜⾊空间转换函数,可以实现RGB颜⾊向HSV,HSI等颜⾊空间的转换,也可以转换为灰度图像。

python库skimage图像直方图均衡化、自适应均衡化、对比度拉伸实现

python库skimage图像直方图均衡化、自适应均衡化、对比度拉伸实现

python库skimage图像直⽅图均衡化、⾃适应均衡化、对⽐度拉伸实现直⽅图全局均衡化from skimage import exposure# Equalizationimg_eq = exposure.equalize_hist(img)直⽅图⾃适应均衡化# Adaptive Equalization# 参数2:Clipping limit, normalized between 0 and 1 (higher values give more contrast).img_adapteq = exposure.equalize_adapthist(img, clip_limit=0.03)直⽅图对⽐度拉伸# Contrast stretchingp2, p98 = np.percentile(img, (2, 98))img_rescale = exposure.rescale_intensity(img, in_range=(p2, p98))实验:直⽅图全局均衡化、⾃适应均衡化、对⽐度拉伸效果对⽐"""======================Histogram Equalization======================This examples enhances an image with low contrast, using a method called*histogram equalization*, which "spreads out the most frequent intensityvalues" in an image. The equalized image has a roughly linear cumulativedistribution function.While histogram equalization has the advantage that it requires no parameters,it sometimes yields unnatural looking images. An alternative method is*contrast stretching*, where the image is rescaled to include all intensitiesthat fall within the 2nd and 98th percentiles."""import matplotlibimport matplotlib.pyplot as pltimport numpy as npfrom skimage import data, img_as_floatfrom skimage import exposurematplotlib.rcParams['font.size'] = 8def plot_img_and_hist(image, axes, bins=256):"""Plot an image along with its histogram and cumulative histogram."""image = img_as_float(image)ax_img, ax_hist = axes# 共⽤x轴ax_cdf = ax_hist.twinx()# Display imageax_img.imshow(image, cmap=plt.cm.gray)ax_img.set_axis_off()# Display histogramax_hist.hist(image.ravel(), bins=bins, histtype='step', color='black')ax_hist.ticklabel_format(axis='y', style='scientific', scilimits=(0, 0))ax_hist.set_xlabel('Pixel intensity')ax_hist.set_xlim(0, 1)ax_hist.set_yticks([])# Display cumulative distributionimg_cdf, bins = exposure.cumulative_distribution(image, bins)ax_cdf.plot(bins, img_cdf, 'r')# 设置右侧坐标轴为空ax_cdf.set_yticks([])return ax_img, ax_hist, ax_cdf# Load an example imageimg = data.moon()# Contrast stretchingp2, p98 = np.percentile(img, (2, 98))img_rescale = exposure.rescale_intensity(img, in_range=(p2, p98))# Equalizationimg_eq = exposure.equalize_hist(img)# Adaptive Equalization# 参数2:Clipping limit, normalized between 0 and 1 (higher values give more contrast). img_adapteq = exposure.equalize_adapthist(img, clip_limit=0.03)# Display resultsfig = plt.figure(figsize=(8, 5))axes = np.zeros((2, 4), dtype=np.object)axes[0, 0] = fig.add_subplot(2, 4, 1)for i in range(1, 4):axes[0, i] = fig.add_subplot(2, 4, 1+i, sharex=axes[0,0], sharey=axes[0,0])for i in range(0, 4):axes[1, i] = fig.add_subplot(2, 4, 5+i)ax_img, ax_hist, ax_cdf = plot_img_and_hist(img, axes[:, 0])ax_img.set_title('Low contrast image')y_min, y_max = ax_hist.get_ylim()ax_hist.set_ylabel('Number of pixels')# 左侧y轴范围为0到y_max,5个刻度ax_hist.set_yticks(np.linspace(0, y_max, 5))ax_img, ax_hist, ax_cdf = plot_img_and_hist(img_rescale, axes[:, 1])ax_img.set_title('Contrast stretching')ax_img, ax_hist, ax_cdf = plot_img_and_hist(img_eq, axes[:, 2])ax_img.set_title('Histogram equalization')ax_img, ax_hist, ax_cdf = plot_img_and_hist(img_adapteq, axes[:, 3])ax_img.set_title('Adaptive equalization')ax_cdf.set_ylabel('Fraction of total intensity')# 右侧y轴范围为0到1,5个刻度ax_cdf.set_yticks(np.linspace(0, 1, 5))# prevent overlap of y-axis labelsfig.tight_layout()plt.show()。

直方图均衡化的C++实现(基于openCV)

直方图均衡化的C++实现(基于openCV)

直⽅图均衡化的C++实现(基于openCV)这是数字图像处理课的⼤作业,完成于 2013/06/17,需要调⽤ openCV 库,完整源码和报告如下:1 #include <cv.h>2 #include <highgui.h>3 #include <stdio.h>4 #include <stdlib.h>5 #include <math.h>6 #include <assert.h>7 #include <string>89/* 灰度级结点 */10 typedef struct {11int pixels; // 灰度级对应像素个数12float rate; // 像素⽐例13float accuRate; // 累计像素⽐例14int map; // 到均衡化后的灰度级的映射15 } levNode;1617void histeqGray(IplImage* pGray, int levels, int argc);18 IplImage* histImage(IplImage* pSrc, int histWidth, int histHeight, int nScale);1920int main(int argc, char* argv[])21 {22int levels;23 std::string imgName, inTmp;24if (argc == 3) {25 levels = atoi(argv[1]);26 imgName = argv[2];27 }28else if (argc == 2)29 imgName = argv[1];30else {31 printf("usage: histeq [levels] image_name \n");32return -1;33 }3435 IplImage* pSrc = cvLoadImage(imgName.c_str(), CV_LOAD_IMAGE_UNCHANGED);36int channel = pSrc->nChannels;3738 IplImage* pChnl[4] = { NULL };3940for (int i = 0; i < channel; ++i)41 pChnl[i] = cvCreateImage(cvGetSize(pSrc), pSrc->depth, 1);4243 cvSplit(pSrc, pChnl[0], pChnl[1], pChnl[2], pChnl[3]);4445for (int i = 0; i < channel; ++i)46 histeqGray(pChnl[i], levels, argc);4748 IplImage* pEql = cvCreateImage(cvGetSize(pSrc), pChnl[0]->depth, pSrc->nChannels);4950 cvMerge(pChnl[0], pChnl[1], pChnl[2], pChnl[3], pEql);5152 inTmp = imgName + "_Eql.jpg";53 cvSaveImage(inTmp.c_str(), pEql);5455//cvNamedWindow(imgName.c_str(), CV_WINDOW_AUTOSIZE);56 cvShowImage(imgName.c_str(), pSrc);57//cvNamedWindow(inTmp.c_str(), CV_WINDOW_AUTOSIZE);58 cvShowImage(inTmp.c_str(), pEql);5960 IplImage* pSrcGray = cvCreateImage(cvGetSize(pSrc), IPL_DEPTH_8U, 1);61if (pSrc->nChannels == 3)62 cvCvtColor(pSrc, pSrcGray, CV_BGR2GRAY);63else64 cvCopyImage(pSrc, pSrcGray);65 IplImage* pEqlGray = cvCreateImage(cvGetSize(pEql), IPL_DEPTH_8U, 1);66if (pSrc->nChannels == 3)67 cvCvtColor(pEql, pEqlGray, CV_BGR2GRAY);68else69 cvCopyImage(pEql, pEqlGray);70 imgName += "_Hist.jpg";71 inTmp += "_Hist.jpg";72int nScale = 2;73int histWidth = /*pSrc->width * nScale*/256 * nScale;74int histHeight = /*pSrc->height*/128;75 IplImage* pSrcGrayHist = histImage(pSrcGray, histWidth, histHeight, nScale);76 IplImage* pEqlGrayHist = histImage(pEqlGray, histWidth, histHeight, nScale);77 cvSaveImage(imgName.c_str(), pSrcGrayHist);78 cvSaveImage(inTmp.c_str(), pEqlGrayHist);79 cvShowImage(imgName.c_str(), pSrcGrayHist);80 cvShowImage(inTmp.c_str(), pEqlGrayHist);8182 cvWaitKey();8384 cvReleaseImage(&pEql);85 cvReleaseImage(&pEqlGray);86for (int i = 0; i < channel; ++i)87 cvReleaseImage(&pChnl[i]);88 cvReleaseImage(&pSrc);89 cvReleaseImage(&pSrcGray);9091return0;92 }9394/*95* 直⽅图均衡化函数96* pGray为输⼊的灰度图97* levels为均衡化的灰度级98*/99void histeqGray(IplImage* pGray, int levels, int argc)100 {101int depth = pGray->depth;102 printf("%d \n", depth);103int width = pGray->width;104int height = pGray->height;105int sumPixels = width * height; // 总像素数106 printf("%d \n", sumPixels);107int values = static_cast<int>(pow((float)2, depth)); // 根据图像深度计算像素取值范围108if (argc == 2) levels = values;109 printf("%d \n", levels);110111int outDepth;112/*if (levels <= 2)113 outDepth = 1;114 else*/if (levels <= 256)115 outDepth = 8;116else if (levels <= 65536)117 outDepth = 16;118119 assert(levels <= values);120int intervals = values / levels; // 根据像素取值范围和灰度级求每个灰度级的像素间隔121 levNode* levNodes = (levNode*)calloc(levels, sizeof(levNode)); // ⽣成灰度结点122//for (int lev = 0; lev < levels; ++lev) printf("%d \n", levNodes[lev].pixels);123//char* pValues = pGray->imageData;124125/* 统计每个灰度级的像素个数 */126for (int y = 0; y < height; ++y)127for (int x = 0; x < width; ++x) {128 CvScalar scal = cvGet2D(pGray, y, x);129int val = (int)scal.val[0];130//printf("%d \n", val);131for (int lev = 0; lev < levels; ++lev) {132if ( val >= intervals*lev && val < intervals*(lev+1)) {133 ++levNodes[lev].pixels; break;134 }135 }136 }137138int sum = 0;139for (int lev = 0; lev < levels; ++lev)140 sum += levNodes[lev].pixels;141 printf("%d \n", sum);142143/* 计算每个灰度级像素⽐例和累计⽐例 */144 levNodes[0].accuRate = levNodes[0].rate = levNodes[0].pixels / (float)sumPixels; 145 levNodes[0].map = (int)(levNodes[0].accuRate * (levels - 1) + 0.5);146 printf("%d \n", levNodes[0].pixels);147for (int lev = 1; lev < levels; ++lev) {148 levNodes[lev].rate = levNodes[lev].pixels / (float)sumPixels;149 levNodes[lev].accuRate = levNodes[lev-1].accuRate + levNodes[lev].rate;150 levNodes[lev].map = (int)(levNodes[lev].accuRate * (levels - 1) + 0.5);151 }152 printf("%f \n", levNodes[levels-1].accuRate);153154/* ⽣成均衡化后的图像 */155for (int y = 0; y < height; ++y)156for (int x = 0; x < width; ++x) {157 CvScalar scal = cvGet2D(pGray, y, x);158int val = (int)scal.val[0];159//printf("%d \n", val);160for (int lev = 0; lev < levels; ++lev) {161if (val >= intervals*lev && val < intervals*(lev+1)) {162 scal.val[0] = levNodes[lev].map;163//printf("%f \n", scal.val[0]);164 cvSet2D(pGray, y, x, scal);165break;166 }167 }168 }169 pGray->depth = outDepth;170171 free(levNodes);172 }173174/*175* 绘制直⽅图函数176*/177 IplImage* histImage(IplImage* pSrc, int histWidth, int histHeight, int nScale)178 {179int histSize = static_cast<int>(pow((float)2, pSrc->depth));180 CvHistogram* pHist = cvCreateHist(/*pSrc->nChannels*/1, &histSize, CV_HIST_ARRAY);181 cvCalcHist(&pSrc, pHist);182183 IplImage* pHistImg = cvCreateImage(cvSize(histWidth, histHeight), IPL_DEPTH_8U, 1);184 cvRectangle(pHistImg, cvPoint(0,0), cvPoint(pHistImg->width,pHistImg->height), CV_RGB(255,255,255), CV_FILLED);185186float histMaxVal = 0;187 cvGetMinMaxHistValue(pHist, 0, &histMaxVal);188189for(int i = 0; i < histSize; i++)190 {191float histValue= cvQueryHistValue_1D(pHist, i); // 像素为i的直⽅块⼤⼩192int nRealHeight = cvRound((histValue / histMaxVal) * histHeight); // 要绘制的⾼度193 cvRectangle(pHistImg,194 cvPoint(i*nScale, histHeight - 1),195 cvPoint((i + 1)*nScale - 1, histHeight - nRealHeight),196 cvScalar(i),197 CV_FILLED198 );199 }200//cvFillConvexPoly201202 cvReleaseHist(&pHist);203return pHistImg;204 }View Code⼀、直⽅图均衡化概述直⽅图均衡化是⼀种图像增强⽅法,其基本思想是把给定图像的直⽅图分布改造成均匀分布的直⽅图,从⽽增加象素灰度值的动态范围,达到增强图像整体对⽐度的效果。

  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;
}。

相关文档
最新文档