当前位置:文档之家› 第5章 直方图修正和彩色变换

第5章 直方图修正和彩色变换

第5章 直方图修正和彩色变换
第5章 直方图修正和彩色变换

第5章直方图修正和彩色变换这一章,我们主要和调色板打交道。先从最简单的反色讲起。

5.1 反色

反色(invert)就是形成底片效果。例如,图5.2为图5.1反色后的结果。

图5.1 原图

图5.2 图5.1反色后的结果

反色有时是很有用的,比如,图5.1中黑色区域占绝大多数,这样打印起来很费墨,我们可以先进行反色处理后再打印。

反色的实际含义是将R、G、B值反转。若颜色的量化级别是256,则新图的R、G、B值为255减去原图的R、G、B值。这里针对的是所有图,包括真彩图、带调色板的彩色图(又称为伪彩色图)、和灰度图。针对不同种类有不同的处理。

先看看真彩图。我们知道真彩图不带调色板,每个象素用3个字节,表示R、G、B三个分量。所以处理很简单,把反转后的R、G、B值写入新图即可。

再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的颜色反转,形成新调色板,而位图数据不用动,就能够实现反转。

灰度图是一种特殊的伪彩色图,只不过调色板中的R、G、B值都是一样的而已。所以反转的处理和上面讲的一样。

这里,我想澄清一个概念。过去我们讲二值图时,一直都说成黑白图。二值位图一定是黑白的吗?答案是不一定。我们安装Windows95时看到的那幅setup.bmp是由蓝色和黑色组成的,但它实际上是二值图。原来,它的调色板中的两种颜色是黑与蓝,而不是黑与白。所以说二值图也可以是彩色的,只不过一般情况下是黑白图而已。

下面的程序实现了反色,注意其中真彩图和调色板位图处理时的差别。

BOOL Invert(HWND hWnd)

{

DWORD OffBits,BufSize; LPBITMAPINFOHEADER lpImgData;

LPSTR lpPtr;

HLOCAL hTempImgData;

LPBITMAPINFOHEADER lpTempImgData;

LPSTR lpTempPtr;

HDC hDc;

HFILE hf;

LONG x,y;

LOGPALETTE *pPal;

HPALETTE hPrevPalette=NULL;

HLOCAL hPal;

DWORD i;

unsigned char Red,Green,Blue;

OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

BufSize=OffBits+bi.biHeight*LineBytes; //新开缓冲区的大小if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL) {

MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK| MB_ICONEXCLAMATION);

return FALSE;

}

lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);

lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);

//拷贝头信息

memcpy(lpTempImgData,lpImgData,BufSize);

hDc=GetDC(hWnd);

if(NumColors!=0){ //NumColors不为0说明是带调色板的

lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER);

//指向原图数据

lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER);

//指向新图数据

//为新调色板分配内存

hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+

NumColors*sizeof(PALETTEENTRY));

pPal =(LOGPALETTE *)LocalLock(hPal);

pPal->palNumEntries =(WORD) NumColors;

pPal->palVersion = 0x300;

for (i = 0; i < NumColors; i++) {

Blue=(unsigned char )(*lpPtr++);

Green=(unsigned char )(*lpPtr++);

Red=(unsigned char )(*lpPtr++);

lpPtr++;

//反转调色板中的颜色,存入新的调色板

pPal->palPalEntry[i].peRed=(BYTE)(255-Red);

pPal->palPalEntry[i].peGreen=(BYTE)(255-Green);

pPal->palPalEntry[i].peBlue=(BYTE)(255-Blue);

pPal->palPalEntry[i].peFlags=0;

*(lpTempPtr++)=(unsigned char)(255-Blue);

*(lpTempPtr++)=(unsigned char)(255-Green);

*(lpTempPtr++)=(unsigned char)(255-Red);

*(lpTempPtr++)=0;

}

if(hPalette!=NULL)

DeleteObject(hPalette);

hPalette=CreatePalette(pPal); //产生新的调色板

LocalUnlock(hPal);

LocalFree(hPal);

if(hPalette){

hPrevPalette=SelectPalette(hDc,hPalette,FALSE);

RealizePalette(hDc);

}

}

else{ //不带调色板,说明是真彩色图

for(y=0;y

lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);

lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);

for(x=0;x

Blue=(unsigned char )(*lpPtr++);

Green=(unsigned char )(*lpPtr++);

Red=(unsigned char )(*lpPtr++);

//反转位图数据中的颜色,存入新的位图数据中

*(lpTempPtr++)=(unsigned char)(255-Blue);

*(lpTempPtr++)=(unsigned char)(255-Green);

*(lpTempPtr++)=(unsigned char)(255-Red);

}

}

}

if(hBitmap!=NULL)

DeleteObject(hBitmap);

hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,

(LPSTR)lpTempImgData+

sizeof(BITMAPINFOHEADER)+

NumColors*sizeof(RGBQUAD),

(LPBITMAPINFO)lpTempImgData,

DIB_RGB_COLORS);

if(hPalette && hPrevPalette){

SelectPalette(hDc,hPrevPalette,FALSE);

RealizePalette(hDc);

}

hf=_lcreat("c:\\invert.bmp",0);

_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));

_lwrite(hf,(LPSTR)lpTempImgData,BufSize);

_lclose(hf);

//释放内存和资源

ReleaseDC(hWnd,hDc);

LocalUnlock(hTempImgData);

LocalFree(hTempImgData);

GlobalUnlock(hImgData);

return TRUE;

}

5.2 彩色图转灰度图

第2章中提到了YUV的颜色表示方法,在这种表示方法中,Y分量的物理含义就是亮度,它含了灰度图(grayscale)的所有信息,只用Y分量就完全能够表示出一幅灰度图来。YUV和RGB之间有着如下的对应关系:

我们利用上式,根据R、G、B的值求出Y值后,将R、G、B值都赋值成Y,就能表示出灰度图来,这就是彩色图转灰度图的原理。

先看看真彩图。我们知道真彩图不带调色板,每个象素用3个字节,表示R、G、B三个分量。所以处理很简单,根据R、G、B的值求出Y值后,将R、G、B值都赋值成Y,写入新图即可。

再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的彩色变成灰度,形成新调色板,而位图数据不用动,就可以了。

下面的程序实现了彩色图到灰度图的转换,注意其中真彩图和调色板位图处理时的差别。

BOOL ColortoGrayScale(HWND hWnd)

{

DWORD SrcOffBits,SrcBufSize,DstBufSize,DstLineBytes;

LPBITMAPINFOHEADER lpImgData;

LPSTR lpPtr;

HLOCAL hTempImgData;

LPBITMAPINFOHEADER lpTempImgData;

LPSTR lpTempPtr;

HDC hDc;

HFILE hf;

LONG x,y;

BITMAPFILEHEADER DstBf;

BITMAPINFOHEADER DstBi;

LOGPALETTE *pPal;

HPALETTE hPrevPalette;

HLOCAL hPal;

DWORD NewNumColors;

WORD NewBitCount;

float Y;

DWORD i;

unsigned char Red,Green,Blue,Gray;

NewNumColors=NumColors; //NewNumColors为新图的颜色数

NewBitCount=bi.biBitCount; //NewBitCount为新图的颜色位数

if(NumColors==0) //真彩图

{

NewNumColors=256;

NewBitCount=8;

}

//由于颜色位数有可能发生了改变,所以要重新计算每行占用的字节数以及//新图的缓冲区大小

DstLineBytes=(DWORD)WIDTHBYTES(bi.biWidth*NewBitCount);

DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NewNumColors* sizeof(RGBQUAD)+(DWORD)DstLineBytes*bi.biHeight);

//DstBf和DstBi为新的BITMAPFILEHEADER和BITMAPINFOHEADER //拷贝原来的头信息

memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER));

memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER));

//做必要的改变

DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER);

DstBf.bfOffBits=(DWORD)(NewNumColors*sizeof(RGBQUAD)+

sizeof(BITMAPFILEHEADER)+

sizeof(BITMAPINFOHEADER));

DstBi.biClrUsed=0;

DstBi.biBitCount=NewBitCount;

//原图的缓冲区的大小

SrcOffBits=bf.bfOffBits- sizeof(BITMAPFILEHEADER);

SrcBufSize=SrcOffBits+bi.biHeight*LineBytes;

if((hTempImgData=LocalAlloc(LHND,DstBufSize))==NULL)

{

MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|

MB_ICONEXCLAMATION);

return FALSE;

}

lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);

lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); //拷贝头信息和位图数据

memcpy(lpTempImgData,lpImgData,DstBufSize);

//用新的BITMAPINFOHEADER替换原来的头信息

memcpy(lpTempImgData,(char *)&DstBi,sizeof(BITMAPINFOHEADER));

//lpPtr指向原图的数据

lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER);

//lpTempPtr指向新图的数据

lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER);

//为新的调色板分配内存

hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NewNumColors

* sizeof(PALETTEENTRY));

pPal =(LOGPALETTE *)LocalLock(hPal);

pPal->palNumEntries =(WORD) NewNumColors;

pPal->palVersion = 0x300;

if(NumColors==0) //真彩色

for (i = 0; i < 256; i++) { //灰度从(0,0,0)到(255,255,255)

pPal->palPalEntry[i].peRed=(BYTE)i;

pPal->palPalEntry[i].peGreen=(BYTE)i;

pPal->palPalEntry[i].peBlue=(BYTE)i;

pPal->palPalEntry[i].peFlags=(BYTE)0;

*(lpTempPtr++)=(unsigned char)i;

*(lpTempPtr++)=(unsigned char)i;

*(lpTempPtr++)=(unsigned char)i;

*(lpTempPtr++)=0;

}

else

for (i = 0; i < NewNumColors; i++) { //带调色板的彩色图

Blue=(unsigned char )(*lpPtr++);

Green=(unsigned char )(*lpPtr++);

Red=(unsigned char )(*lpPtr++);

Y=(float)(Red*0.299+Green*0.587+Blue*0.114);

Gray=(BYTE)Y;

lpPtr++;

//从原来的调色板中的颜色计算得到Y值,写入新的调色板

pPal->palPalEntry[i].peRed=Gray;

pPal->palPalEntry[i].peGreen=Gray;

pPal->palPalEntry[i].peBlue=Gray;

pPal->palPalEntry[i].peFlags=0;

*(lpTempPtr++)=(unsigned char)Gray;

*(lpTempPtr++)=(unsigned char)Gray;

*(lpTempPtr++)=(unsigned char)Gray;

*(lpTempPtr++)=0;

}

if(hPalette!=NULL)

DeleteObject(hPalette);

//生成新的逻辑调色板

hPalette=CreatePalette(pPal);

LocalUnlock(hPal);

LocalFree(hPal);

hDc=GetDC(hWnd);

if(hPalette){

hPrevPalette=SelectPalette(hDc,hPalette,FALSE);

RealizePalette(hDc);

}

if(NumColors==0) //真彩色图才需要处理位图数据

for(y=0;y

lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y*LineBytes);

lpTempPtr=(char*)lpTempImgData+

(DstBufSize-DstLineBytes-y*DstLineBytes);

for(x=0;x

Blue=(unsigned char )(*lpPtr++);

Green=(unsigned char )(*lpPtr++);

Red=(unsigned char )(*lpPtr++);

Y=(float)(Red*0.299+Green*0.587+Blue*0.114);

//从位图数据计算得到Y值,写入新图中

Gray=(BYTE)Y;

*(lpTempPtr++)=(unsigned char)Gray;

}

}

if(hBitmap!=NULL)

DeleteObject(hBitmap);

//产生新的位图

hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,

(LPSTR)lpTempImgData+

sizeof(BITMAPINFOHEADER)+

NewNumColors*sizeof(RGBQUAD),

(LPBITMAPINFO)lpTempImgData,

DIB_RGB_COLORS);

if(hPalette && hPrevPalette){

SelectPalette(hDc,hPrevPalette,FALSE);

RealizePalette(hDc);

}

hf=_lcreat("c:\\gray.bmp",0);

_lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER));

_lwrite(hf,(LPSTR)lpTempImgData,DstBufSize);

_lclose(hf);

//释放内存和资源

ReleaseDC(hWnd,hDc);

LocalUnlock(hTempImgData);

LocalFree(hTempImgData);

GlobalUnlock(hImgData);

return TRUE;

}

5.3 真彩图转256色图

我们知道,真彩图中包含最多达224种颜色,怎样从中选出256种颜色,又要使颜色的失真比较小,这是一个比较复杂的问题。一种简单的做法是将R:G:B以3:3:2表示,即取R,G的高3位,B的高两位,组成一个字节,这样就可以表示256种颜色了,但不难想象,这种方法的失真肯定很严重。

我们下面介绍的算法能够比较好地实现真彩图到256色图的转换。它的思想是:准备一个长度为4096的数组,代表4096种颜色。对图中的每一个象素,取R、G、B的最高四位,拼成一个12位的整数,对应的数组元素加1。全部统计完后,就得到了这4096种颜色的使用频率。其中,可能有一些颜色一次也没用到,即对应的数组元素为零(假设不为零的数组元素共有PalCounts个)。将这些为零的数组元素清除出去,使得前PalCounts个元素都不为零。将这PalCounts个数按从大到小的顺序排列(这里我们使用起泡排序)。这样,前256种颜色就是用的最多的颜色,它们将作为调色板上的256种颜色。对于剩下的PalCounts-256种颜色并不是简单地丢弃,而是用前256种颜色中的一种来代替,代替的原则是找有最小平方误差的那个。再次对图中的每一个象素,取R、G、B的最高四位,拼成一个12位的整数,如果对应值在前256种颜色中,则直接将该索引值填入位图数据中,如果是在后PalCounts-256种颜色中,则用代替色的索引值填入位图数据中。

下面的两幅图中,图5.3是原真彩图,图.54是用上面的算法转换成的256色图,可以看出,效果还不错。

图5.3 原真彩图

图5.4 转换后的256色图

下面是上述算法的源程序。

BOOL Trueto256(HWND hWnd)

{

DWORD SrcBufSize,OffBits,DstBufSize,DstLineBytes; LPBITMAPINFOHEADER lpImgData;

LPSTR lpPtr;

HLOCAL hTempImgData;

LPBITMAPINFOHEADER lpTempImgData;

LPSTR lpTempPtr;

HDC hDc;

HFILE hf;

LONG x,y;

BITMAPFILEHEADER DstBf;

BITMAPINFOHEADER DstBi;

LOGPALETTE *pPal;

HPALETTE hPrevPalette;

HLOCAL hPal;

WORD i,j;

int Red,Green,Blue,ClrIndex;

DWORD ColorHits[4096];

WORD ColorIndex[4096];

DWORD PalCounts,temp;

long ColorError1,ColorError2;

if(NumColors!=0){ //NumColors不为零,所以不是真彩图MessageBox(hWnd,"Must be a true color bitmap!","Error Message",

MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

//由于颜色位数有可能发生了改变,所以要重新计算每行占用的字节数以及//新图的缓冲区大小

DstLineBytes=(DWORD)WIDTHBYTES(bi.biWidth*8);

DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+

256*sizeof(RGBQUAD)+

(DWORD)DstLineBytes*bi.biHeight);

//DstBf和DstBi为新的BITMAPFILEHEADER和BITMAPINFOHEADER //拷贝原来的头信息

memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER));

memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER));

//做必要的改变

DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER);

DstBf.bfOffBits=(DWORD)(256*sizeof(RGBQUAD)+

sizeof(BITMAPFILEHEADER)

+sizeof(BITMAPINFOHEADER));

DstBi.biClrUsed=0;

DstBi.biBitCount=8;

//OffBits为到实际位图数据的偏移值

OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

//SrcBufSize为原图缓冲区的大小

SrcBufSize=OffBits+bi.biHeight*LineBytes;

if((hTempImgData=LocalAlloc(LHND,DstBufSize))==NULL)

{

MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|

MB_ICONEXCLAMATION);

return FALSE;

}

lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);

lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);

//拷贝位图数据

memcpy(lpTempImgData,lpImgData,OffBits);

//用新的头信息取代旧的头信息

memcpy(lpTempImgData,(char *)&DstBi,sizeof(BITMAPINFOHEADER)); //ColorHits为记录颜色使用频率的数组,ColorIndex为记录颜色索引值的

//数组

//先全部清零

memset(ColorHits,0,4096*sizeof(DWORD));

memset(ColorIndex,0,4096*sizeof(WORD));

for(y=0;y

lpPtr=(unsigned char *)lpImgData+(SrcBufSize-LineBytes-y*LineBytes);

for(x=0;x

//R,G,B各取4位

Blue=(int)(*(lpPtr++) & 0xf0);

Green=(int)(*(lpPtr++) & 0xf0);

Red=(int)(*(lpPtr++) & 0xf0);

//拼成一个12位整数

ClrIndex=(Blue<<4) + Green +(Red >>4);

//相应的数组元素加1

ColorHits[ClrIndex]++;

}

}

PalCounts=0;

//将为零的元素清除出去

for (ClrIndex = 0; ClrIndex < 4096; ClrIndex++)

{

if(ColorHits[ClrIndex]!=0){

ColorHits[PalCounts]=ColorHits[ClrIndex];

//注意调整相应的索引值

ColorIndex[PalCounts]=ClrIndex;

PalCounts++; //颜色数加1

}

}

//用起泡排序将PalCounts种颜色按从大到小的顺序排列for (i = 0; i < PalCounts-1; i++)

for (j = i + 1; j < PalCounts; j++){

if (ColorHits[j] > ColorHits[i]){

temp = ColorHits[i];

ColorHits[i] = ColorHits[j];

ColorHits[j] = temp;

//注意调整相应的索引值

temp = ColorIndex[i];

ColorIndex[i] = ColorIndex[j];

ColorIndex[j] = (WORD)temp;

}

}

//为新的调色板分配内存

hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) +

256* sizeof(PALETTEENTRY));

pPal =(LOGPALETTE *)LocalLock(hPal);

pPal->palNumEntries =(WORD) 256;

pPal->palVersion = 0x300;

lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER);

for (i = 0; i < 256; i++) {

//由12位索引值得到R,G,B的最高4位值

pPal->palPalEntry[i].peRed=(BYTE)((ColorIndex[i] & 0x00f) << 4);

pPal->palPalEntry[i].peGreen=(BYTE)((ColorIndex[i] & 0x0f0));

pPal->palPalEntry[i].peBlue=(BYTE)((ColorIndex[i] & 0xf00) >> 4);

pPal->palPalEntry[i].peFlags=(BYTE)0;

*(lpTempPtr++)=(unsigned char)((ColorIndex[i] & 0xf00) >> 4);

*(lpTempPtr++)=(unsigned char)((ColorIndex[i] & 0x0f0));

*(lpTempPtr++)=(unsigned char)((ColorIndex[i] & 0x00f) << 4);

*(lpTempPtr++)=0;

//ColorHits作为颜色记数的作用已经完成了,下面的作用是记录12位索//引值对应的调色板//中的索引值

ColorHits[i]=i;

}

//其余的颜色依据最小平方误差近似为前256中最接近的一种if (PalCounts > 256){

for (i = 256; i < PalCounts; i++){

//ColorError1记录最小平方误差,一开始赋一个很大的值

ColorError1=1000000000;

//由12位索引值得到R,G,B的最高4位值

Blue = (long)((ColorIndex[i] & 0xf00) >> 4);

Green = (long)((ColorIndex[i] & 0x0f0));

Red = (long)((ColorIndex[i] & 0x00f) << 4);

ClrIndex = 0;

for (j = 0; j < 256; j++){

//ColorError2计算当前的平方误差

ColorError2=(long)(Blue-pPal->palPalEntry[j].peBlue)* (Blue-pPal->palPalEntry[j].peBlue)+ (long)(Green-pPal->palPalEntry[j].peGreen)* (Green-pPal->palPalEntry[j].peGreen)+

(long)(Red-pPal->palPalEntry[j].peRed)*

(Red-pPal->palPalEntry[j].peRed);

if (ColorError2 < ColorError1){ //找到更小的了

ColorError1 = ColorError2;

ClrIndex = j; //记录对应的调色板的索引值

}

}

//ColorHits记录12位索引值对应的调色板中的索引值

ColorHits[i] = ClrIndex;

}

}

if(hPalette!=NULL)

DeleteObject(hPalette);

//产生新的逻辑调色板

hPalette=CreatePalette(pPal);

LocalUnlock(hPal);

LocalFree(hPal);

hDc=GetDC(hWnd);

if(hPalette){

hPrevPalette=SelectPalette(hDc,hPalette,FALSE);

RealizePalette(hDc);

}

for(y=0;y

lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y*LineBytes);

lpTempPtr=(char*)lpTempImgData+

(DstBufSize-DstLineBytes-y*DstLineBytes);

for(x=0;x

//R,G,B各取4位

Blue=(int)(*(lpPtr++) & 0xf0);

Green=(int)(*(lpPtr++) & 0xf0);

Red=(int)(*(lpPtr++) & 0xf0);

//拼成一个12位整数

ClrIndex=(Blue<<4) + Green +(Red >>4);

for (i = 0; i < PalCounts;i++)

if (ClrIndex == ColorIndex[i]){

//根据12索引值取得对应的调色板中的索引值

数字图像处理实验报告

实验一灰度图像直方图统计 一、实验目的 掌握灰度图像直方图的概念和计算方法,了解直方图的作用和用途。提高学生编程能力,巩固所学知识。 二、实验内容和要求 (1)用Photoshop显示、了解图像平均明暗度和对比度等信息; (2)用MatLab读取和显示一幅灰度图像; (3)用MatLab编写直方图统计的程序。 三、实验步骤 1. 使用Photoshop显示直方图: 1)点击文件→打开,打开一幅图像; 2)对图像做增强处理,例如选择图像→调整→自动对比度对图像进行灰度拉伸,观察图像进行对比度增强前后的视觉变化。 3)利用统计灰度图像直方图的程序分别针对灰度拉伸前后的灰度图像绘制其灰度直方图,观察其前后的直方图变化。 2.用MatLab读取和显示一幅灰度图像; 3. 绘制图像的灰度直方图; function Display_Histogram()

Input=imread('timg.jpg'); figure(100); imshow(uint8(Input)); title('原始图像'); Input_Image=rgb2gray(Input); figure(200); imshow(uint8(Input_Image)); title('灰度图像'); sum=0; His_Image=zeros(1,256); [m,n]=size(Input_Image); for k=0:255 for I=1:m for j=1:n if Input_Image(I,j)==k His_Image(k+1)=His_Image(k+1)+1; end end end end figure(300); plot(His_Image); title('图像的灰度直方图'); 4.显示图像的灰度直方图。

直方图均衡化处理教学内容

实验 1.直方图均衡化程序的原理及步骤 直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某灰度区间变成在全部灰度范围内的均匀分布。 直方图均衡化的原理: 直方图均衡化是把原图像的直方图通过灰度变换函数修正为灰度均匀分布的直方图,然后按均衡直方图修正原图像,其变换函数取决于图像灰度直方图的累积分布函数。概括地说,就是把一已知灰度概率分布的图像,经过一种变换,使之演变成一幅具有均匀概率分布的新图像。当图像的直方图为一均匀分布时,图像的信息熵最大,此时图像包含的信息量最大,图像看起来更清晰。灰度直方图用各灰度值出现的相对频数(该灰度级的像素数与图像总像素数之比)表示。 直方图表示数字图像中每一灰度级与其出现频数的的统计关系,用横坐标表示灰度级,纵坐标表示频数。直方图就能给出该图像的概貌性描述,例如图像的灰度范围、每个灰度级的频数和灰度的分布、整幅图像的亮度和平均明暗对比度等,由此可得出进一步处理的重要依据。计算每个灰度级出现的概率为: P r (r k )=N k /N k=0,1,2,…,L-1 上式中, P r (r k )表示第k 个灰度级出现的概率,N k 为第 k 个灰度级出现的频数,N 为图像像素总数,L 为图像中可能的灰度级总数。由此可得直方图均衡化变换函数,即图像的灰度累积分布函数Sk 为: 1,...,2,1,0)()(00-====∑∑==L k r P r T s k j N N k j j r k k j 上式中, S k 为归一化灰度级。 这个变换映射称做直方图均衡化或直方图线性化。 直方图均衡化过程如下: (1) 输出原图像; (2) 根据公式P r (r k )=n k /m*n ( k=0,1,2,…,L-1)计算对应灰度级出现的概率, 绘制原图像的直方图。 (3) 计算原图象的灰度级累积分布函数:sk=Σp r (r k ); (4) 取整Sk=round((S1*256)+0.5);将Sk 归一到相近的灰度级,绘制均衡化后的 直方图。 (5) 将每个像素归一化后的灰度值赋给这个像素,画出均衡化后的图像。 2.根据直方图均衡化步骤对输入的原图象进行处理,输出的图像如下图所示。

直方图修正

实验名称:直方图修正 一、实验目的 1.对影像进行直方图规定化和均衡化 2.利用另外一幅影像进行直方图匹配 3.利用直方图统计功能对结果进行分析 二、实验内容 1.对两幅卫星遥感影像进行规定化并统计分析 2.对一幅卫星遥感影像进行均衡化并统计分析 三、实验所用的仪器设备 计算机和ENVI软件在不同时刻同地的卫星遥感影像2幅 四、实验原理 1.直方图规定化:是使原图像灰度直方图变成规定形状的直方图而对原始图像作修正的增强 方法。 作用:对于在不同时间获取的同一地区或者邻接地区的图像,或者是由于太阳高度角或大 气的影响引起差异的图像很有用,特别是对图像镶嵌和变化检测。 2.直方图均衡化:又称直方图平坦化,是将一已知灰度概率密度分布的影响,经过某种变换变 成一幅具有均匀灰度概率密度分布的新影像,其结果是是扩大了像元取值得动态范围。 效果:(1) 均衡后每个灰度级的像元频率近似相等。(2)频率少的灰度级被合并,频率数高 的灰度级被保留,可以增强影像上大面积地物与周围地物的反差。 五、实验步骤 1.直方图规定化与统计: 1)同时打开两幅遥感影像,影像显示号分别为Display#1,Display#2. 规划化前影像——Display#2 规划化前影像——Display#1 2)在Display#2的主影像窗口选择Enhance/Histogram Matching,出现Histogram Matching Input parameter对化框。 3)在“Match To”列表中,选择匹配的直方图的影像显示号Display#1。 4)在Input Histogram/Image/OK得到直方图匹配后的结果。

数字图像处理点运算和直方图处理

实验1 点运算和直方图处理 一、实验目的 1. 掌握利用Matlab图像工具箱显示直方图的方法 2. 掌握运用点操作进行图像处理的基本原理。 3. 进一步理解利用点操作这一方法进行图像处理的特点。 4. 掌握利用Matlab图像工具箱进行直方图均衡化的基本方法。 二、实验的硬件、软件平台 硬件:计算机 软件:操作系统:WINDOWS 7 应用软件:MATLAB 三、实验内容及步骤 1. 了解Matlab图像工具箱的使用。 2. 利用Matlab图像工具箱对图像进行点操作,要求完成下列3个题目中 的至少2个。 ⑴图1灰度范围偏小,且灰度偏低,改正之。 ⑵图2暗处细节分辨不清,使其能看清楚。 ⑶图3亮处细节分辨不清,使其能看清楚。 图1 图2 图3 3. 给出处理前后图像的直方图。 4. 利用MatLab图像处理工具箱中函数对以上图像进行直方图均衡化操 作,观察结果。 四、思考题 1. 点操作能完成哪些图像增强功能? 2. 直方图均衡化后直方图为何并不平坦?为何灰度级会减少? 五、实验报告要求

1.对点操作的原理进行说明。 2.给出程序清单和注释。 3.对处理过程和结果进行分析(包括对处理前后图像的直方图的分析)。 实验代码以及解读 点操作: I = imread('POINT1.BMP')。 %读入图像 j=rgb2gray(I)。%将图像转为灰度图像 INFO=IMFINFO('POINT1.BMP') %获取图片的格式、尺寸、颜色数量、修改时间等信息[l,r]=size(j)。%图片大小 figure。%建立一个图形框 subplot(221) imshow(j) %在两行两列的第一个位置放置图片j title('POINT1.BMP') %给该图片加上标题POINT1.BMP for m=1:l for n=1:r %从第一个像素循环到最后一个像素p1(m,n)=j(m,n)*1.2。%把各点乘上1.2得到p1图 end end for m=1:l for n=1:r p2(m,n)=j(m,n)*2。%%把各点乘上2得到p2图 end end for m=1:l for n=1:r p3(m,n)=j(m,n)*2+50。%把各点乘上2再加50得到p2图 end end subplot(222) imshow(p1) title('j(m,n)*1.2') %p1图放在第二个位置且冠名j(m,n)*1.2 subplot(223) imshow(p2) title('j(m,n)*2') %p1图放在第三个位置且冠名j(m,n)* 2 subplot(224) imshow(p3) title('j(m,n)*2+50') %p1图放在第四个位置且冠名j(m,n)*2+50 figure。%建立一个新的窗口并且依次显示以上四个图的直方图

数字图像处理实验报告--直方图规定化 0528

数字图像处理实验报告--直方图规定化

数字图像处理实验报告 实验名称:直方图规定化 姓名: 班级: 学号: 专业:电子信息工程(2+2) 指导教师:陈华华 实验日期:2012年5月24日

直方图匹配(规定化) 直方图均衡化能够自动增强整个图像的对比度,但它的具体增强效果不容易控制,处理的结果总是得到全局均匀化的直方图。实际上有时需要变换直方图,使之成为某个特定的形状,从而有选择地增强某个灰度值范围内的对比度。这时可以采用比较灵活的直方图规定化。一般来说正确地选择规定化的函数可以获得比直方图均衡化更好的效果。 所谓直方图规定化,就是通过一个灰度映像函数,将原灰度直方图改造成所希望的直方图。所以,直方图修正的关键就是灰度映像函数。 直方图匹配方法主要有3个步骤(这里设M和N分别为原始图和规定图中的灰度级数,且只考虑N≤M的情况): (1) 如同均衡化方法中,对原始图的直方图进行灰度均衡化: (2) 规定需要的直方图,并计算能使规定的直方图均衡化的变换: (3) 将第1个步骤得到的变换反转过来,即将原始直方图对应映射到规定的直方图,也就是将所有pf(fi)对应到pu(uj)去。 一、A图直方图规定B图

Matlab程序: %直方图规定化 clear all A=imread('C:\Users\hp\Desktop\A.tif'); %读入A图像 imshow(A) %显示出来 title('输入的A图像') %绘制直方图 [m,n]=size(A); %测量图像尺寸 B=zeros(1,256); %预创建存放灰度出现概率的向量 for k=0:255

实验2灰度修正技术1

实验2 灰度修正技术 一、 实验目的: 1. 掌握灰度变换 2. 深入理解图像直方图的概念,掌握图像直方图的绘制方法 3. 掌握直方图均衡化的原理,并会用直方图均衡化对图像进行处理 二、 实验原理 2.1灰度修正技术 包括直接灰度变换和直方图修正,其目的是增强图像的对比度,使图像更加清晰。 1.灰度变换 灰度变换是一种最简单的图像增强技术,它属于点操作,这种变换方法有多种,如线性变换、对数变换、幂次变换等。 (1) 线性变换 所谓线性变换是指:输出图像灰度值g 和输入图像灰度值f 之间的函数关 系是线性关系。由图2-1(a)所示的线性变换可知,输出图像灰度值g 的表达式可以写成 M m f M m f m n M N g +-=+---=)()(α (2-1) 若α > 1,则输出图像对应的灰度范围扩大,对比度增强;若0 < α < 1,则输出图像对应的灰度范围压缩,对比度减小;若α < 0,则图像灰度值求反(见图2-1(b)),使白变黑,使黑变白。 (a) (b) 图2-1 灰度线性变换 (a)线性变换;(b)求反. (2) 对数变换 设输入图像灰度值为非负值,即0≥f ,则对数变换的数学表达式为 )1log(f c g += (2-2) 式中c 是一个可以调整的常数。当1=c 时,对数变换曲线如图2-2所示。由图可以看出,窄范围的低灰度输入图像值映射为一宽范围输出值,而宽范围的高灰度

值映射为一窄范围的输出值,即暗像素的灰度值范围被扩大,而亮像素的灰度值范围被压缩,这就使低灰度区域的图像细节能够获得清晰的显示。 对数变换能有效地压缩图像的动态范围,其典型应用是图像Fourier 频谱的显示。Fourier 幅度谱的动态范围很大,其数值在0至106数量级范围内变化,而普通显示器的动态范围只有8比特,如果不经对数变换而直接显示,则低数值的细节就无法显示出来。 图2-2 对数变换 (3) 幂次变换 幂次变换的数学表达式可以写成 γf c g ?= (2-3) 式中γ,c 均是正的常数。对于不同的γ值,幂次变换曲线如图2-3所示,图中所有曲线均对应于1=c 的情况。由图可见,当1<γ时,幂次变换将扩大暗像素的灰度值范围,压缩亮像素的灰度值范围,这类似于对数变换;与此相反,当1>γ时,幂次变换将压缩暗像素的灰度值范围,扩大亮像素的灰度值范围;当1=γ时,幂次变换简化为线性变换。

摄像头编程并且对图像的处理以及直方图的算法

题目:图像的基本处理班级:2011级软件2班姓名:刘磊磊 时间:20130907

摘要:随着数字化与多媒体时代的来临,数字图像处理已经成为必备的基础知识。全国各大专院校的计算机、电子、通信、医学、光学及许多相关专业都开设了与数字图像预处理相关的课程。数字图像二值化是图像预处理中的一项重要技术,其在模式识别、光学字符识别、医学成像等方面都有着重要应用。本论文主要为大家介绍24位真彩图像的灰度、二值处理以及图像的一些简单的打开和保存和如何画直方图,还有一些通过这次小学期学到的一些知识。 关键字:灰度处理,二值化 图像的打开 void CText1Dlg::ShowPic() { if(m_path =="") //判断图片路径是否存在 { return; } hwnd = GetDlgItem(IDC_pic); hDesDC = hwnd->GetDC()->m_hDC; hSrcDC = CreateCompatibleDC(hDesDC); hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),m_path,IMAGE_BITMAP,0,0, LR_LOADFROMFILE|LR_CREATEDIBSECTION); GetObject(hBitmap, sizeof(BITMAP), &bm); SelectObject(hSrcDC, hBitmap); hwnd->GetClientRect(&rect); ::SetStretchBltMode(hDesDC,COLORONCOLOR); ::StretchBlt(hDesDC, rect.left, rect.top, rect.right, rect.bottom, hSrcDC, 0, 0, bm.bmWidth, bm.bmHeight,+SRCCOPY); UpdateData(false);

数字图像处理实验报告--直方图规定化

数字图像处理实验报告 实验名称:直方图规定化 姓名: 班级: 学号: 专业:电子信息工程(2+2) 指导教师:陈华华 实验日期:2020年5月24日

直方图匹配(规定化) 直方图均衡化能够自动增强整个图像的对比度,但它的具体增强效果不容易控制,处理的结果总是得到全局均匀化的直方图。实际上有时需要变换直方图,使之成为某个特定的形状,从而有选择地增强某个灰度值范围内的对比度。这时可以采用比较灵活的直方图规定化。一般来说正确地选择规定化的函数可以获得比直方图均衡化更好的效果。 所谓直方图规定化,就是通过一个灰度映像函数,将原灰度直方图改造成所希望的直方图。所以,直方图修正的关键就是灰度映像函数。 直方图匹配方法主要有3个步骤(这里设M和N分别为原始图和规定图中的灰度级数,且只考虑N≤M的情况): (1) 如同均衡化方法中,对原始图的直方图进行灰度均衡化: (2) 规定需要的直方图,并计算能使规定的直方图均衡化的变换: (3) 将第1个步骤得到的变换反转过来,即将原始直方图对应映射到规定的直方图,也就是将所有pf(fi)对应到pu(uj)去。 一、A图直方图规定B图

Matlab程序: %直方图规定化 clear all A=imread('C:\Users\hp\Desktop\A.tif'); %读入A图像 imshow(A) %显示出来 title('输入的A图像') %绘制直方图 [m,n]=size(A); %测量图像尺寸 B=zeros(1,256); %预创建存放灰度出现概率的向量 for k=0:255 B(k+1)=length(find(A==k))/(m*n); %计算每级灰度出现的概率,将其存入B中相应位置 end figure,bar(0:255,B,'g'); %绘制直方图 title('A图像直方图') xlabel('灰度值') ylabel('出现概率') axis([0,260,0,0.015]) C=imread('C:\Users\hp\Desktop\B.tif');%读入B图像 imshow(C) %显示出来 title('输入的B图像') %绘制直方图 [m,n]=size(C); %测量图像尺寸 D=zeros(1,256); %预创建存放灰度出现概率的向量 for k=0:255 D(k+1)=length(find(C==k))/(m*n); %计算每级灰度出现的概率,将其存入D中相应位置 end

图像的直方图是图像的重要统计特征

图像的直方图是图像的重要统计特征,它可以认为是图像灰度密度函数的近似。直方图虽然不能直接反映出图像内容,但对它进行分析可以得出图像的一些有用特征,这些特征能反映出图像的特点。当图像对比度较小时,它的灰度直方图只在灰度轴上较小的一段区间上非零,较暗的图像由于较多的像素灰度值低,因此它的直方图的主体出现在低值灰度区间上,其在高值灰度区间上的幅度较小或为零,而较亮的图像情况正好相反。通常一幅均匀量化的自然图像的灰度直方图在低值灰度区间上频率较大,这样的图像较暗区域中的细节常常看不清楚。为使图像变清晰,可以通过变换使图像的灰度动态范围变大,并且让灰度频率较小的灰度级经变换后,其频率变得大一些,使变换后的图像灰度直方图在较大的动态范围内趋于均化。事实证明,通过图像直方图修改进行图像增强是一种有效的方法。 均匀量化的自然图像的灰度直方图通常在低值灰度区间上频率较大,使得图像中较暗区域中的细节常常看不清楚。为了使图像清晰,可将图像的灰度范围拉开,并且让灰度频率较小的灰度级变大,即让灰度直方图在较大的动态范围内趋于一致。 前面介绍的直方图均衡化处理方法从实验效果看还是很不错的,从实现算法上也可以看出其优点主要在于能自动整幅图像的对比度,但具体的增强效果也因此不易控制,只能得到全局均衡化处理的直方图。在科研和工程应用中往往要根据不同的要求得到特定形状的直方图分布以有选择的对某灰度范围进行局部的对比度增强,此时可以采用对直方图的规定化处理,通过选择合适的规定化函数取得期望的效果。 a=imread('花.jpg'); subplot(2,2,1); imshow(a); title('原始图像'); subplot(2,2,2); a=rgb2gray(a); imhist(a); title('原始图像直方图'); subplot(2,2,3);

遥感实验报告直方图的修正

实验名称:直方图的修正 一、实验内容 1.对影像进行直方图均衡化。 2.利用另外一幅影像进行直方图匹配。 二、实验所用的仪器设备,包括所用到的数据 电脑一台,遥感影像处理软件(ENVI4.3),bhtmref遥感影像 三、实验原理 (一)直方图的均衡化 1.定义:又称直方图的平坦化。是将一已知的灰度概率密度分布的影像,经过某种变换,变成 一幅具有均匀灰度概率密度分布的新影像,结果是扩大了像元取值的动态范围。 2.直方图均衡的效果: (1)均衡后每个灰度级的像元频率近似相等 (2)频数少的灰度级被合并,频数高的灰度级被保留,可以增强影像上大面积地物与周围地物的反差。 (二)直方图的规定化 1.定义:是使原影像灰度直方图变成规定形状的直方图而对原始影像做修正的增强方法。 2.原理:先对原始影像进行均衡化,再对希望影像进行均衡化,由原始影像均衡化的灰度级得 到希望影像的灰度级。 3.作用:对于在不同时间获取的同一地区或者邻接地区的影像,或者是由于太阳高度角或大气 的影响引起差异的影像很有用,特别是对影像镶嵌和变化检测。 四、实验步骤及其结果分析 (一)直方图均衡化 1.实验步骤: (1)打开bhtmref遥感影像,显示如图一所示。 (2)在Image窗口菜单上点击Enhance/[Image]Equalization,得到结果影像(图2)。 (3)点击New Display,在image窗口菜单上点击Enhance/[Zoom]Equalization,得到结果影像(图3)。 图1.TM432(RGB)合成影像图2.图1Image窗口均衡化结果影像图3.图1 Zoom窗口均衡化影像结果

基于matlab的直方图均衡化讲解

课程设计报告 题目基于matlab的直方图均衡化程序设计 学生姓名: 学生学号: 系别: 专业: 届别: 指导教师: 电气信息工程学院制

目录 1、引言·······················································································- 2 - 2、直方图基础 ···············································································- 2 - 3、直方图均衡化············································································- 3 -3.1 直方图均衡化的概念·····················································································- 3 -3.2 直方图均衡化理论························································································- 4 - 3.3 Matlab 实现······························································································- 4 - 4、结论 ······················································································- 10 - 5、心得体会················································································- 10 -参考文献·····················································································- 10 - 基于matlab的直方图均衡化程序设计

直方图修正法

直方图修正法 分为直方图均衡化和直方图规定化 目的:采用直方图修整后可使图像的灰度间距拉开或使灰度分布均匀,从而增大反差,使图像细节清晰,从而增强图像。 1.直方图均衡化 通过对原图像进行某种变换使原图像的灰度直方图修正为均匀的直方图的一种方法 以r 和s 分别表示归一化了的原图像灰度和经直方图修正后的图像灰度。 即 1,0≤≤s r 在[]1,0区间内的任一个r ,经变换T (r )都可产生一个S ,且 S=T(r) T(r)为变换函数,应满足下列条件: (1)在10≤≤r 内为单调递增函数(保证灰度级从黑到白的次序不变); (2)在10≤≤r 内,有1)(0≤≤r T 。(确保映射后的像素灰度在允许的范围内) 由概率论理论可知,如果已知随机变量r 的概率密度为 )(r p r ,而随机变量s 是r 的函数,则s 的概率密度)(s p s 可以由)(r p r 求出。假定随机变量s 的分布函数 用)(s F s 表示,根据分布函数定义,则有 ??∞-∞-== s r r s s dr r ds s s p p F )()()([])()(1s ds d s T p p r s -=? (1) 因为归一化假定 1)(=s p s 由(1)得dr r ds p r )(= 两边积分得 ?==r r dr r r T s p 0)()( (变换函数) 上式表明当变换函数T (r )是原图像直方图累积分布函数时,能达到直方图均衡化的目的。 对于灰度级为离散的数字图像,用频率来代替概率。 ∑∑=====k j k j j j r k k n r T n r p s 00)()( 1,,2,1,0,10-=≤≤L k r k 2.直方图规定化(直方图匹配) 使原图像灰度直方图变成规定形状的直方图而对图像作修正的增强方法。 假设)(r p r 和)(z p z 分别表示已归一化的原图像灰度概率密度函数和希望得到

编程实现计算图像直方图、图像熵解析

数字图像处理实验报告——图像常用格式及显示 武汉大学 2016.04

1 实验内容 本实验报告主要介绍 主要内容 1. 理解灰度映射原理; 2. 掌握灰度映射计算方法; 3. 理解图像直方图的定义; 4. 理解图像直方图的作用; 5. 理解图像熵的定义及作用; 6. 掌握图像直方图计算方法; 7. 掌握图像熵的计算方法; 8. 进一步熟悉图像文件256色、24位真彩色BMP图像格式; 9. 进一步熟悉Visual C++ 6.0编程界面,及使用方法; 10. 熟悉Visual C++中绘图函数方法; 11. 编程完成计算图像几种灰度映射; 12. 编程实现计算图像直方图、图像熵; 13. 编程绘制图像直方图; 14. 根据不通灰度映射处理观察图像直方图变化; 15. 总结实验过程(实验报告):编程、调试、结果、分析、结论。 主要目的 1. 建立相关实验环境:从指定服务器指定位置拷贝实验相关材料,包括:实验要求,实例程序,示例图像,VC++6.0程序,实验相关幻灯片; 2. 使用实验一建立的简单多文档应用程序框架及、图像夺取和显示功能,进一步熟悉图像的格式及显示,熟悉图像的组织和存储方式。 3. 编写图像线性灰度映射: 4. 编写图像直方图统计程序: 5. 观察图像直方图 主要函数说明 1.void CZhangyanImageView::OnProcessZhifangtu() 函数目的:在用户界面中添加直方图处理,并添加函数在.cpp文件中 函数参数说明:建立直方图处理函数 2.void CZhangyanImageView::OnProcessLinetran() 函数目的:在用户界面中添加灰度变换处理,并添加函数在.cpp文件中函数参数说明:建立灰度变换处理函数 主要代码注释 1.灰度变换函数代码 CZhangyanImageDoc* pDoc = GetDocument();//定义引用doc的指针ASSERT_V ALID(pDoc); unsigned char * pBits=pDoc->m_pBits;//把文件中的m_pBits赋予pBits int nWidth=pDoc->imageWidth; int nHeight=pDoc->imageHeight;//定义整形的image图片宽和高

实验三图像灰度修正技术和直方图均衡化

实验三图像灰度修正技术和直方图均衡化 一、实验目的 1、掌握图像灰度修正技术的原理和实现方法; 2、掌握图像直方图均衡化处理的方法。 二、实验原理及内容 图像增强的目的是,对一幅给定的图像,突出一些有用的信息,抑制一些无用的信息,提高图像的使用价值。 常用的图像增强方法有:灰度修正法、平滑、几何校正、图像锐化、频域增强、维纳滤波、卡尔曼滤波等。Matlab图像处理工具箱中的函数imadjust实现上述对比度调整算法。 函数实现: J=imadjust(I,[low high],[bottom top],gamma) Matlab函数实现: (1)求图像的灰度直方图 Imhist ( I,n ) (2)求灰度的等值图 Imcontour ( I,n ) (3)直方图均衡化 J=histeq (I, hgram ) 实验内容: 1、显示图像“bacteria.tif”的灰度直方图和灰度等值图; 2、对给定图像“pout.tif”进行灰度变换、增强对比度,显示增强前、后的图像以及它们的灰度直方图; 3、对给定图像“pout.tif”进行直方图均衡处理,显示处理前、后的图像以及它们的灰度直方图; 三、实验报告要求 1、给出求图像“bacteria.tif”的灰度直方图和灰度等值图的Matlab程序,并显示图像的灰度直方图和灰度等值图的; 2、给出对图像“pout.tif”进行灰度变换、增强对比度的Matlab程序,显示增强前、后的图像以及它们的灰度直方图;对结果进行分析。 3、给出对图像“pout.tif”进行直方图均衡处理的Matlab程序,显示处理前、后的图像以及它们的灰度直方图;对结果进行分析。 四、实验程序及框图

计算图像的直方图

南通大学计算机科学与技术学院 《数字图像处理》课程实验 报告书 实验名计算图像的直方图 班级计 121 姓名张进 学号 1213022016 2014年6月 16 日

一、实验内容 1、打开一张图,计算其直方图。 二、图像直方图的概念 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。 图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。在实际工程中,图像直方图在特征提取、图像匹配等方面都有很好的应用。 三、灰度直方图的计算 1、灰度直方图的定义 灰度直方图是灰度级的函数,描述图像中该灰度级的像素个数(或该灰度级像素出现的频率):其横坐标是灰度级,纵坐标表示图像中该灰度级出现的个数(频率)。 一维直方图的结构表示为 高维直方图可以理解为图像在每个维度上灰度级分布的直方图。常见的是二维直方图。如红-蓝直方图的两个分量分别表示红光图像的灰度值和蓝光图像灰度值的函数。其图像坐标(Dr,Db)处对应在红光图像中具有灰度级Dr同时在蓝光图像中具有灰度级Db的像素个数。这是基于多光谱——每个像素有多个变量——的数字图像,二维中对应每个像素统计个变量。 简单的说,直方图就是对数据进行统计,将统计值组织到一系列事先定义好的bin中。bin的数值是从数据中计算出的特征的统计量,这些数据可以是诸如梯度,方向,色彩或者任何其他特征。无论如何,直方图获得的是数据分布的统计图。通常直方图的数据要低于原始数据。由于原始数据点可以表征任何事情,所以直方图实际上是一个方便表示图像特征的手段。

直方图均衡化(DOC)

中北大学 课程设计说明书 学生姓名:学号: 学院:信息与通信工程学院 专业:电子信息工程 题目:专业综合实践图像处理部分: 直方图均衡化 指导教师:杨娜职称: 副教授 2016 年 1月 10 日

中北大学 课程设计任务书 15/16 学年第一学期 学院:信息与通信工程学院 专业:电子信息工程 学生姓名:学号: 学生姓名:学号: 学生姓名:学号: 课程设计题目:专业综合实践图像处理部分: 直方图均衡化 起迄日期:2016年1 月11日~2016年1月22 日课程设计地点: 指导教师:杨娜 系主任:王浩全 下达任务书日期: 2016 年1月 10 日

课程设计任务书

课程设计任务书

目录 引言.................................... 错误!未定义书签。 1 设计任务及其要求...................... 错误!未定义书签。 2 直方图基础 (4) 3 直方图均衡化 (14) 4 Matlab实现 (16) 5 结果分析 (18) 6 心得体会 (19)

前言 灰度直方图是图像的一种统计表达,它反映了该图中不同灰度级出现的统计概率。由于图像的视觉效果与直方图有对应关系,即直方图的形状和改变对视觉的感知影响很大,因此采用直方图变换的方式可以增强图像。 图像增强是指对图像的某些特征,如边缘、轮廓或对比度等进行强调或尖锐化。当一幅图像曝光不足或过度,造成对比度过小或过大而不能显示具体细节,通过增加这些细节的动态范围改善图像的视觉效果。图像增强可以突出图像中所感兴趣的特征信息,改善图像的主观视觉质量,提高图像的可懂度。 增强的首要目标是处理图像,使其比原始图像更适合于特定应用。图像增强的方法分为两大类:空间域方法和频域方法。“空间域”一词是指图像平面本身,这类方法是以对图像的像素直接处理为基础的。“频域”处理技术是以修改图像的傅氏变换为基础的。一般说来,原始遥感数据的灰度值范围都比较窄,这个范围通常比显示器的显示范围小的多。增强处理可将其灰度范围拉伸到0-255 的灰度级之间来显示,从而使图像对比度提高,质量改善。增强主要以图像的灰度直方图最为分析处理的基础。直方图均衡化能够增强整个图像的对比度,提高图像的辨析程度,算法简单,增强效果好。

直方图修正法

重庆交通大学 测量与空间信息处理实验报告 实验课程:遥感原理及应用 实验名称:直方图修正法 班级: 姓名: 学号: 实验日期:2012 年11 月17 日

实验原理 一.直方图均衡化 直方图均衡算法是图象增强空域法中的最常用、最重要的算法之一。目前较常用的增强方法有全局直方图均衡化、局部直方图均衡化两大类。 全局直方图均衡化是将原图像的直方图通过变换函数变为均匀的直方图, 然后按均匀直方图修正原图像, 从而获得一幅灰度分布均匀的新图像。它以概率理论作基础, 运用灰度点运算来实现直方图的变换, 从而达到图象增强的目的。它的变换函数取决于图像灰度直方图的累积分布函数。概括的说, 就是把一已知灰度概率分布的图像, 经过一种变换, 使之演变成一幅具有均匀概率分布的新图像。当图像的直方图为一均匀分布时,图像的信息熵最大,此时图像包含的信息量最大,图像看起来就显得清晰。 下面先讨论连续变化图像的均衡化问题。 设r 、s 分别表示原图像和增强后图像的灰度。假设r 被归一化到区间[0,1], 且r =0 表示黑色及 r = 1表示白色。当r 、s 在[0,1] 之间时,表示像素灰度在黑白之间变化。灰度变换函数为 s=T(r) 0≤r≤1 (1) 它满足以下两个条件: (1) T(r)在区间0≤r≤1中为单值且单调递增; (2) 当0≤r≤1时, 0 ≤T(r)≤1; 条件(1)中要求T(r)为单值是为了保证反变换存在, 单调条件保证原图各灰度级在变换后仍保持从黑到白( 或从白到黑) 的排列次序; 条件(2)保证变换前后灰度值动态范围的一致性。 图1 给出了满足这两个条件的一个变换函数的例子, 由s 到r 的反变换可以 表示为: = 0≤s≤1 (2) r- ), (1s T 即使 T(r)满足条件(1)和(2), 相应的函数) (1s T-也可能不为单值。

图像的直方图统计实验报告

华侨大学 数字图像处理与图像通信实验报告 实验题目:图像的直方图统计 专业、班级:通信3班 学生姓名: 学号: 分数: 2014 年 6 月 4 日

一、实验目的: 掌握直方图统计的算法原理和程序设计,了解各种图像的直方图统计的意义及其用途。 二、实验设备: 计算机、matlab 7.0软件 三、实验原理 灰度直方图是灰度值的函数,描述的是图像中具有该灰度值的像素的个数,其横坐标表示像素的灰度级别,纵坐标是该灰度出现的频率(像素个数与图像像素总数之比)。 直方图的作法如下: a )将图像的灰度级归一化 若图像的灰度级为:0,1, ,1,L -则令 ,0,1,,1 10 1.k k k r k L L r = =--≤≤则 在灰度级中,0k r =代表黑,1k r =代表白。对于一幅给定的图像来说,每一个像素取得[0,1]区间内的灰度级是随机的,也就是说k r 是一个随机变量。 b)计算各灰度级的像素概率 ()()k k k r k k r k n r n n p r n n k p r = 设为灰度级为的像素的个数,为总的像素个数,令 是像素值为的像素的频数,为其出现的概率 c)作图 建立直角坐标系,横轴表示r k 的取值,纵轴表示p r (r k )的取值,作p r (r k )的函数图。 四、实验内容: 实现对一幅灰度图像的像素的统计,并绘制直方图。 程序编码: I=imread('C:\MATLAB7\work\2.png'); figure(1) subplot(1,2,1) imshow(I); title('原图') add=[];

tab1=zeros(1,256) for n=0:255 X=I==n; add=[add;sum(sum(X))]; end; [a b]=size(I); final=add/(a*b); subplot(1,2,2); bar(0:255,final,'g'); title('灰度级图象') 原图 -100 010******* 00.005 0.01 0.015 0.02 0.025 0.03 0.035 灰度级图象

课设报告正文(MATLAB的图像直方图的计算与显示)

目录 摘要........................................................................ I 1 基础介绍 (1) 1.1MATLAB简介 (1) 1.2数字图像处理简介 (1) 2 设计原理分析 (3) 2.1灰度直方图的定义 (3) 2.2设计原理 (3) 2.3常用函数介绍 (3) 3 程序及运行结果 (4) 3.1流程图 (4) 3.2源程序 (4) 3.3运行结果 (5) 3.4库函数运行结果 (7) 4设计总结 (8) 5心得体会 (9) 参考文献 (10)

1 基础介绍 1.1MATLAB简介 MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。 MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。 MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++ ,JAVA的支持。可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进行下载就可以用。 1.2数字图像处理简介 数字图像处理(Digital Image Processing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。数字图像处理最早出现于20世纪50年代,当时的电子计算机已经发展到一定水平,人们开始利用计算机来处理图形和图像信息。数字图像处理作为一门学科大约形成于20世纪60年代初期。早期的图像处理的目的是改善图像的质量,它以人为对象,以改善人的视觉效果为目的。图像处理中,输入的是质量低的图像,输出的是改善质量后的图像,常用的图像处理方法有图像增强、复原、编码、压缩等。

利用直方图均衡化和直方图规定化对图像进行增强

利用直方图均衡化和直方图规定化对图像进行增强 4.1 利用直方图均衡化对图像进行增强 通过灰度变换将一幅图像转换为另一幅具有均衡直方图的图像,即在一定灰度范围内具有相同的象素点数的图像的过程。其“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。 主要缺点: 1、变换后图像的灰度级减少,某些细节消失; 2、某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。 算法如下: 为讨论方便,以r 和s 分别表示归一化了的原图像灰度和经直方图修正后的图像灰度。即1,0≤≤s r 在[0,1]内设有变换 S=T(r) 且该函数单调递增,1)(0≤≤r T ,于是有反变换)(1s T r -= 有概率论知,如果已知随即变量r 的概率密度)(r p r ,而随机变量s 是r 的函数。则s 的概率密度)(s p s 可以有)(r p r 求出。 [])()()()()(1s T ds d r p ds dr r p dr r p ds d s p r r r r s -∞-==??????=? 从上式可以看出通过变换函数)(r T 可以控制图像灰度级的概率密度函数,从而改变图像灰度层次,这就是直方图修正技术的基础。 因为归一化规定 1)(=s p s 有1式有 dr r p ds r )(= 两边积分得 dr r p r T s r r )()(0?== 上式就是所求得的变换函数。它表明当变换函数)(r T 是原图像直方图累积分布函数时,能达到直方图均衡化的目的。 离散形式可表示为: ∑∑ =====k i i k i i r k k n n r p r T s 00)()(

matlab直方图修正

MATLAB 中直方图均衡化和规定化处理函数格式如 下: (1) J = imhist( I , n) (2) J = imhist( I , map) (3) [ counts , X ] = imhist ( I , ?) (4) J = histeq( I , n) (5) J = histeq( I , ma p , n) (6) [ J , counts ] = histeq( I , ?) 说明:对于格式(1) ,显示图像I 的直方图,n 为灰度级 数目,灰度图像的缺省值为256 ,黑白图像缺省值为2 ;对于 格式(2) ,J 返回调色板为map 的图像I 的直方图;对格式(3) ,返回图像I 的每个灰度上的像素点数目;格式(4) 对图 像I 均衡化处理,n 表示灰度级数目,缺省值为64 ;格式(5) 对调色板为map 的灰度图像均衡化处理,返回有n 级灰度 的图像;格式(6) 对图像I 均衡化处理后同时返回各灰度 值。 下面举例说明直方图均衡化和规定化处理: I = imread(′rice. t i f′) ; %读入图像 imshow( I) ; %显示图像 tit le(′原始图像′) ; f igure , imhist ( I ,256) ; %显示原始图像直方图, 灰度级为256 tit le(′原始图像直方图′) ; %直方图均衡化处理 J = histeq( I ,32) ; %均衡化处理为灰度级为32 的直方图figure , imshow( J) ; tit le(′均衡化图像(32 级)′) ; figure , imhist ( J ,256) ; [ counts , x ] = imhist ( J) ; %获得均衡化处理后直方图各像素点灰度级以便后面图像规定化 tit le(′均衡化图像直方图1′) ; %直方图规定化处理 K = imread(′pout . t i f′) ; figure , imshow( K) ; tit le(′要规定化图像′) ; figure , imhist ( K) ; tit le(′要规定化图像直方图′) ; L = histeq( K, counts) ; %规定化处理 figure , imshow( L) ; tit le(′规定化后图像′) ; figure , imhist ( L) ; tit le(′规定化后图像直方图′) ; 程序实现的图像如图1~7 所示,其中图1 和图2 为原 始图像及其直方图,原始图像较暗且动态范围小;图3 和图

相关主题
文本预览
相关文档 最新文档