光学图像处理实验报告
直方图均衡化的研究
一、摘要
直方图均衡化就是把一已知灰度概率分布的图像经过一种变换,使之演变成一幅具有均匀灰度概率分布的新图像。它是以累积分布函数变换法为基础的直方图修正法。分析和总结灰度直方图的均衡化算法并通过VC++实验验证该方法能有效达到图像增强的目的。对于较为暗淡的图像,采用直方图均衡化能够增强其整体对比度,获的较为理想的观察效果。
二、关键字
灰度统计 直方图 均衡化
三、实验原理
1、直方图的理论基础:
(1)直方图概念:灰度直方图表示图像中每种灰度出现的频率。
(2)直方图的作用: 反映一幅图像的灰度分布特性
n(3)直方图的计算: p(rk)?k0?rk?1k?0,1,2,?,l?1 n
式中:nk为图像中出现rk级灰度的像素数,n是图像像素总数,而nk/n即为频数。
2、设计目的: 产生一幅灰度级分布具有均匀概率密度的图像,扩展像素取值的动态范围,
达到了图象增强的目的。
3、直方图均衡化的效果 :
1)变换后直方图趋向平坦,灰级减少,灰度合并。
2)原始象含有象素数多的几个灰级间隔被拉大了,压缩的只是象素数少的几个灰
度级,实际视觉能够接收的信息量大大地增强了,增加了图象的反差。同
时,也增加了图象的可视粒度。
4、离散情况下的直方图均衡化的算法:
A、列出原始图像的灰度级 fj,j?0,1,?,L?1
B、统计各灰度级的像素数目 nj,j?0,1,?,L?1
C、计算原始图像直方图各灰度级的频数 Pf(fj)?nj/n,j?0,1,?,L?1
kD、计算累积分布函数 C(f)?j?0Pf(fj),j?0,1,?,k,?L?1
F、应用以下公式计算映射后的输出图像的灰度级,P为输出图像灰度级的个数,
其中INT为取整符号:
gi?INT[(gmax?gmin)C(f)?gmin?0.5]
G、用的映射关系修改原始图像的灰度级,从而获得直方图近似为均匀分布的输出
图像。
?
四、实验内容及源程序
1、灰度分布密度的统计
程序代码如下:
/***********************************************
*函数名称:ZhiFangTu(float *tongji)
*函数类型:void
*变量说明:tongji,灰度分布密度统计
*功能:对图像进行灰度直方图统计
***********************************************/
void CAAAView::OnZhifangtu(float *tongji)
{
// TODO: Add your command handler code here
int huidu[256];//灰度计数
CAAADoc* pDoc = GetDocument();
LPSTR lpDIB;
LPSTR lpDIBBits;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
lpDIBBits = ::FindDIBBits(lpDIB);//原图数据区指针
int iH,iW;
memset(huidu,0,sizeof(huidu));//变量初始化
iH = ::DIBHeight(lpDIB);//宽
iW = ::DIBWidth(lpDIB); //长
LPBYTE temp1=new BYTE[iH*iW];//新图像缓冲区
memcpy(temp1,lpDIBBits,iH*iW);//复制原图像到缓冲区 for(int i=0;i<iH;i++)//对各像素进行灰度统计
{ for(int j=0;j<iW;j++)
{ unsigned char temp;
temp=temp1[iW*i+j];//灰度统计计数
huidu[temp]++;
}
}
for( i=0;i<256;i++)//统计灰度分布密度
tongji[i]=huidu[i]/(iH*iW*1.0f);
}
2、直方图分布的均衡化
(1)统计直方图数组,用一个数组p记录p?i?;
(2)i从1开始,令s?i??s?i?1??p?i?;
(3)一个数组L记录新的s的索引值,即令L?i??s?i?*(256?1);
(4)依次循环每个像素,取原图的像素值作为数组L的下标值,取该下标值对应的数组值作为均衡化之后的像素值。
程序代码如下:
/***********************************************
*函数名称:zhifangtujunheng
*函数类型:void
*变量说明:无
*功能:对图像进行灰度分布均衡化处理
***********************************************/
void CAAAView::OnZhifangtujunheng()
{
// TODO: Add your command handler code here
CAAADoc* pDoc = GetDocument();
LPSTR lpDIB;
LPSTR lpDIBBits;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
lpDIBBits = ::FindDIBBits(lpDIB);//原图数据区指针
float Hdmd[256];//灰度密度
float temp[256];//中间变量
int a[256];
long i,j;
memset(temp,0,sizeof(temp));//初始化
OnZhifangtu(Hdmd);//获取图像的灰度密度分布
for(i=0;i<256;i++)//进行均衡化处理
{
if(i==0)
{
temp[0]=Hdmd[0];
}
else
{
temp[i]=temp[i-1]+Hdmd[i];
}
a[i]=(int)(255.0f*temp[i]+0.5f);
}
long iH,iW;
iH = ::DIBHeight(lpDIB);//宽
iW = ::DIBWidth(lpDIB); //长
for(i=0;i<iH;i++)//对各个像素进行灰度变换
{ for(j=0;j<iW;j++)
{ unsigned char temp1;//将转换后的灰度分布写入dib图像 temp1=*(lpDIBBits+i*iW+j);
*(lpDIBBits+i*iW+j)=a[temp1];
}
}
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
EndWaitCursor();
}
五、实验结果的分析与比较
a原图如下所示:
b均衡后的结果如下:
结论:图像直方图趋于平坦化,且灰度间隔被拉大,从而有利于图像的分析和识别。对于较为暗淡的图像,采用直方图均衡化能够增强其整体对比度,获的较为理想的观察效果。
六、参考文献
VC++图像处理程序设计(第二版)(杨淑莹等 编著)
第二篇:图像处理实验报告一
一.图像的读入与直方图拓展
>> clear;
>> clear all;
>> I=imread('pout.tif');
>> imshow(I)
>> whos
Name Size Bytes Class
I 291x240 69840 uint8 array
Grand total is 69840 elements using 69840 bytes
>> figure,imhist(I)
>> I2=histeq(I);
>> figure,imhist(I2)
>> figure,imshow(I2)
>> imwrite(I2,'pout.tif')
>> imfinfo('pout.tif')
ans =
Filename: 'pout.tif'
FileModDate: '19-Dec-2012 18:52:08'
FileSize: 67816
Format: 'tif'
FormatVersion: []
Width: 240
Height: 291
BitDepth: 8
ColorType: 'grayscale'
FormatSignature: [73 73 42 0]
ByteOrder: 'little-endian'
NewSubfileType: 0
BitsPerSample: 8
Compression: 'PackBits'
PhotometricInterpretation: 'BlackIsZero'
StripOffsets: [9x1 double]
SamplesPerPixel: 1
RowsPerStrip: 34
StripByteCounts: [9x1 double]
XResolution: 72
YResolution: 72
ResolutionUnit: 'Inch'
Colormap: []
PlanarConfiguration: 'Chunky'
TileWidth: []
TileLength: []
TileOffsets: []
TileByteCounts: []
Orientation: 1
FillOrder: 1
GrayResponseUnit: 0.0100
MaxSampleValue: 255
MinSampleValue: 0
Thresholding: 1
二、同时读入若干幅图像,可以频繁使用figure,imshow;但若要求在同一窗口读入若干幅图像:则可调用subplot函数。
I1=imread('pout.tif');
>> I2=imread('moon.tif');
>> I3=imread('onion.png');
>> I4=imread('tire.tif');
>> subplot(2,2,1),imshow(I1);
>> subplot(2,2,2),imshow(I2);
>> subplot(2,2,3),imshow(I3);
>> subplot(2,2,4),imshow(I4);
三、还可以尝试读入其它的图片,进行形态学的开闭运算操作、骨骼化、条纹细化等操作,并可尝试改变结构元素等操作。
图片处理
>> I=imread('rice.png');
>> imshow(I)
>> b=imopen(I,strel('disk',15));
>> I2=imsubtract(I,b);
>> figure,imshow(I2)
>> %图像有些暗,调对比度
>> I3=imadjust(I2,stretchlim(I2),[]);
>> figure,imshow(I3)
>> %检查图像中的对象个数
>> level=graythresh(I3);
>> b2=im2bw(I3,level);%b2=im2bw(I3,graythresh(I3))
>> figure,imshow(b2)
>> [l,num]=bwlabel(b2,4);
>> num
num =
101
>> c=imcrop(l);%裁剪图片
>> figure,imshow(c)
>> rgb_c=label2rgb(l,@spring,'c','shuffle');
>> figure,imshow(rgb_c)