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

合集下载

基于CCS的数字图像直方图均衡化的设计

基于CCS的数字图像直方图均衡化的设计

基于CCS的数字图像直方图均衡化的设计作者:杨宏来源:《现代电子技术》2010年第08期摘要:直方图均衡化是最常用的图像增强方法之一,目前大多是用Matlab软件仿真,不利于硬件实现。

为了克服这一不足,这里给出了直方图均衡化算法以及程序设计流程,并在CCS v3.1的软件仿真环境下进行仿真实验。

结果表明,对图像进行直方图均衡化达到了增强的效果。

这为图像处理提供了一种硬件实现的方法。

关键词:CCS; 直方图均衡化; 数字图像; Matlab中图分类号:TP311文献标识码:B文章编号:1004-373X(2010)08-0111-02Design of Digital Image Histogram Equalization Based on CCSYANG Hong(College of Electronic Engineering, Xi’an University of Post and Telecommunications,Xi’an710061, C hina)Abstract:Histogram equalization is one of the image enhancement methods in common use.At present,the usage of Matlab software simulation is not benefit for hardware implementation. In order to overcome this shortfall, a histogram equalization algorithm and program design process are given, and the simulation is done in the CCS v3.1 software simulation environment. The results show that the histogram equalization on images achieves an enhanced effect. The method ofhardware implementation is provided for the image processing.Keywords:CCS; histogram equalization; digital image; Matlab图像增强处理技术一直是图像处理领域中一类非常重要的基本处理技术[1-2]。

基于CCS的数字图像直方图均衡化的设计

基于CCS的数字图像直方图均衡化的设计

0 引 言图像增强处理技术一直是图像处理领域中一类非常重要的基本处理技术[1-2]。

通过采用适当的增强处理技术,可以将原本模糊不清甚至根本无法分辨的原始图片,处理成清楚、明晰的富含大量有用信息的可使用图像,因此此类图像处理技术在医学、遥感、微生物、刑侦以及军事等诸多领域得到了广泛应用。

灰度直方图[3-4]是数字图像处理中一个最简单、最有用的工具,它描述了一副图像的灰度级内容。

直方图均衡化[5-7]是最常用的图像增强方法之一。

1 直方图均衡化算法直方图均衡化算法将原图像的直方图改变为在整个灰度范围内基本均匀地分布的形式,由此扩大了像素灰度的动态范围,从而增强了图像的对比度。

直方图均衡化算法步骤为:1) 给出原始图像的所有灰度级k S (k=0,1,…,L-1)。

2) 统计原始图像各灰度级的像素数k n 。

3) 根据原图像,计算灰度直方图:()kk n P S n=(k=0,1,…,L-1)(1)式中,n 为总像素数,k n 为灰度级k S 的像素数。

4) 计算原始图像的累积直方图:00()()k k i E k s i i i n t EH S P S n =====∑∑ (01k S ≤≤,k=0,1,…,L-1) (2)5) 取整计算:int[(1)]k k k U N t N=-+ (3) 6) 确定映射关系:k k S U →7) 统计新直方图各灰度级k U 的像素数目k n 。

8) 计算新的直方图:()k k n P t n= (4)2 基于CCS 的数字图像直方图均衡化的设计CCS v3.1(Code Composer Studio IDE v3.1)是TI 公司推出的集成可视化DSP 软件开发工具。

它是一种针对TMS320系列DSP 的集成开发环境,在Windows 操作系统下,采用图形接口界面,提供环境配置、源文件编辑、程序调试、跟踪和分析等工具[8-10]。

CCS 有两种工24作模式,即软件仿真器模式和硬件在线编程模式。

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: 是否将得到的直⽅图向量归⼀化。

数字图像处理均衡化 C#编写

数字图像处理均衡化 C#编写

以下程序是在C#环境下编写的数字图像处理程序,主要是负责图像均衡化这一部分功能该段程序以测试通过,适用于灰度图像以及彩色图像的均衡化,原理挺简单的。

学习数字图像处理的同学们,请参考:原图像较暗饱和度低均衡化后图像效果明显原图像直方图均衡化后的图像分布较均匀private void equalizationItem_Click(object sender, EventArgs e){Color color; //新建一个Color对象;int[] countPixel_R = new int[256]; //应用于计算彩色或灰度图像素的数组int[] countPixel_G = new int[256];int[] countPixel_B = new int[256];int[] tempArray_R = new int[256]; //用来计算灰度的概率分布int[] tempArray_G = new int[256];int[] tempArray_B = new int[256];byte[] pixelMap_R = new byte[256]; //存放新的灰度映射byte[] pixelMap_G = new byte[256];byte[] pixelMap_B = new byte[256];int width = filteredImage.Width;int height = filteredImage.Height;Bitmap temp = new Bitmap(width, height);tempImage = filteredImage;if (tempImage.PixelFormat != PixelFormat.Format24bppRgb){filteredImage =AForge.Imaging.Image.Clone(tempImage,PixelFormat.Format24bppRgb);//适用于彩色图像或者灰度图像的均衡化}//逐个像素点地计算R、G、B channel的灰度分布,如果是灰度图恒有R=G=B;for (int h = 0; h < height; h++){for (int w = 0; w < width; w++){color = filteredImage.GetPixel(w, h);countPixel_R[color.R]++;countPixel_G[color.G]++;countPixel_B[color.B]++;}}for (int i = 0; i < 256; i++){if (i != 0){//计算灰度的累计分布tempArray_R[i] = countPixel_R[i] + tempArray_R[i - 1];tempArray_G[i] = countPixel_G[i] + tempArray_G[i - 1];tempArray_B[i] = countPixel_B[i] + tempArray_B[i - 1];}else if (i == 0){tempArray_R[i] = countPixel_R[0];tempArray_G[i] = countPixel_G[0];empArray_B[i] = countPixel_B[0];}//归一化,计算累计概率函数,也就是灰度变换函数pixelMap_R[i] = (byte)(255.0 * tempArray_R[i] / (width * height) + 0.5);pixelMap_G[i] = (byte)(255.0 * tempArray_G[i] / (width * height) + 0.5);pixelMap_B[i] = (byte)(255.0 * tempArray_B[i] / (width * height) + 0.5);}for (int h = 0; h < height; h++){for (int w = 0; w < width; w++){color = filteredImage.GetPixel(w, h); //像素点原来的灰度值color = Color.FromArgb(pixelMap_R[color.R], pixelMap_G[color.G], pixelMap_B[color.B]); //利用灰度映射,得到新的灰度值temp.SetPixel(w, h, color); //实现灰度值均衡化}}ClearCurrentImage();pictureBox.Image = temp;filteredImage = temp;undoItem.Enabled = true;undoallItem.Enabled = true;equalizationItem.Checked = true;displayHistogram(filteredImage);}。

C语言数字图像处理之直方图均衡化

C语言数字图像处理之直方图均衡化

C语⾔数字图像处理之直⽅图均衡化本⽂实例为⼤家分享了C语⾔直⽅图均衡化的具体代码,供⼤家参考,具体内容如下原理直⽅图均衡化(Histogram Equalization) ⼜称直⽅图平坦化,实质上是对图像进⾏⾮线性拉伸,重新分配图像象元值,使⼀定灰度范围内象元值的数量⼤致相等。

这样,原来直⽅图中间的峰顶部分对⽐度得到增强,⽽两侧的⾕底部分对⽐度降低,输出图像的直⽅图是⼀个较平的分段直⽅图:如果输出数据分段值较⼩的话,会产⽣粗略分类的视觉效果。

直⽅图是表⽰数字图像中每⼀灰度出现频率的统计关系。

直⽅图能给出图像灰度范围、每个灰度的频度和灰度的分布、整幅图像的平均明暗和对⽐度等概貌性描述。

灰度直⽅图是灰度级的函数, 反映的是图像中具有该灰度级像素的个数, 其横坐标是灰度级r, 纵坐标是该灰度级出现的频率( 即像素的个数) pr( r) , 整个坐标系描述的是图像灰度级的分布情况, 由此可以看出图像的灰度分布特性, 即若⼤部分像素集中在低灰度区域, 图像呈现暗的特性; 若像素集中在⾼灰度区域, 图像呈现亮的特性。

灰度数字图像是每个像素只有⼀个采样颜⾊的图像。

这类图像通常显⽰为从最暗⿊⾊到最亮的⽩⾊的灰度。

灰度图像与⿊⽩图像不同,在计算机图像领域中⿊⽩图像只有⿊⽩实现流程:1)统计每个灰度级像素点的个数2)计算灰度分布密度3)计算累计直⽅图分布4)累计分布取整,保存计算出来的灰度映射关系处理图⽚规格800*600 8位灰度单通道原图直⽅图均衡化分析:本次实验中,我故意把原图调暗,进⾏直⽅图均衡化后可以明显感受到整幅图像亮度增⼤了,⽽且某些细节⽅⾯更加突出。

出现问题最初进⾏直⽅图均衡化时,输出结果如下:经分析,是没有对数组初始化置零导致的。

Hist数组是进⾏⼀个统计像素点个数的数组,最初倘若不置零,结果必然毫⽆意义。

故⽽添加数组内存置零的操作:经测试,问题解决。

附代码#include <stdio.h>#include <stdlib.h>#include <memory.h>#define height 600#define width 800typedef unsigned char BYTE; // 定义BYTE类型,占1个字节int main(void){FILE *fp = NULL;//BYTE Pic[height][width];BYTE *ptr;BYTE **Pic = new BYTE *[height];for (int i = 0; i != height; ++i){Pic[i] = new BYTE[width];}fp = fopen("weiminglake_huidu.raw", "rb");ptr = (BYTE*)malloc(width * height * sizeof(BYTE));//创建内存for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){fread(ptr, 1, 1, fp);Pic[i][j] = *ptr; // 把图像输⼊到2维数组中,变成矩阵型式ptr++;}}fclose(fp);int hist[256];float fpHist[256];float eqHistTemp[256];int eqHist[256];int size = height *width;int i, j;memset(&hist, 0x00, sizeof(int) * 256);memset(&fpHist, 0x00, sizeof(float) * 256);memset(&eqHistTemp, 0x00, sizeof(float) * 256);for (i = 0; i < height; i++) //计算差分矩阵直⽅图直⽅图统计每个灰度级像素点的个数{for (j = 0; j < width; j++){unsigned char GrayIndex = Pic[i][j];hist[GrayIndex] ++;}}for (i = 0; i< 256; i++) // 计算灰度分布密度{fpHist[i] = (float)hist[i] / (float)size;}for (i = 0; i< 256; i++) // 计算累计直⽅图分布{if (i == 0){eqHistTemp[i] = fpHist[i];}else{eqHistTemp[i] = eqHistTemp[i - 1] + fpHist[i];}}//累计分布取整,保存计算出来的灰度映射关系for (i = 0; i< 256; i++){eqHist[i] = (int)(255.0 * eqHistTemp[i] + 0.5);}for (i = 0; i < height; i++) //进⾏灰度映射均衡化{for (j = 0; j < width; j++){unsigned char GrayIndex = Pic[i][j];Pic[i][j] = eqHist[GrayIndex];}}fp = fopen("output.raw", "wb");for (i = 0; i < height; i++){for (j = 0; j < width; j++){fwrite(&Pic[i][j], 1, 1, fp);}}fclose(fp);return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

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

数字图像的直方图均衡化(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 = 256
int 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 image
return -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 histgram
val = 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 image
dst = 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;
}。

相关文档
最新文档