1、2.1灰度直方图原理分析1、灰度直方图 直方像图反映了图的像素的灰度分布是反映一幅图像中的灰度级与出现这种灰度级的像素的概率之间关系的图形。直方图的横坐标为灰度级(用r表示),纵坐标是具有该灰度级的像素个数或出现此灰度级的概率P(rk)。设N(=ab)为一幅图像中像素总数,nk为第k级灰度的像素数;r k表示第k个灰度级。则: P(rk)= nk /N (归一化后k级灰度像素数)定义:反映各灰度级出现频数的分布情况,进而反映图像对(清晰)度,但不反映各灰度级的空间位置分布。图像的(灰度统计)直方图是一个一维的离散函数。它的定义为:设sk为图像f(x,y)的第k级灰度值,nk是f(x,y)中具有
2、灰度值sk的象素的个数,n是图像象素总数,则:ps(sk)= nk/n k=0,1,L-1称为图像f(x,y)的直方图。这里ps(sk)代表原始图中第k个灰度级的出现概率。以nk为自变量,以ps(sk)为函数,得到的曲线就是图像的直方图,在实际中常常直接将对第k个灰度级的统计值nk作为图像的直方图。它提供了原图灰度值的分布情况,也可以说给出了一幅图所有灰度值的整体描述。对灰度图像进行直方图统计的程序流程图如图2-2所示。 图2-2 灰度图像直方图统计流程2、直方图均衡化如上面所述,一幅给定的图像的灰度级分布在0 r 1范围内。可以对0, 1区间内的任一个 r 值进行如下变换 也就是说,通过上述
3、变换,每个原始图像的像素灰度值 r 都对应产生一个 s 值。 变换函数T(r)应满足下列条件:(1)在0r1区间内,T(r)单值单调增加;(2)对于0r1,有0T(r)1。这里的第一个条件保证了图像的灰度级从白到黑的次序不变。第二个条件则保证了映射变换后的像素灰度值在允许的范围内。3、直方图规定化希望能够有目的地增强某个灰度区间的图像, 即能够人为地修正直方图的形状, 使之与期望的形状相匹配,这就是直方图规定化的基本思想。换句话说,希望可以人为地改变直方图形状,使之成为某个特定的形状,直方图规定化就是针对上述要求提出来的一种增强技术,它可以按照预先设定的某个形状来调整图像的直方图。直方图规定化
4、是在运用均衡化原理的基础上,通过建立原始图像和期望图像之间的关系,选择地控制直方图,使原始图像的直方图变成规定的形状,从而弥补了直方图均衡不具备交互作用的特性。4、BMP图像文件格式BMP图像文件是Microsoft Windows所规定的图像文件格式。随着Windows的风行全球,BMP图像文件也就成为PC机上流行的图像文件格式。BMP图像文件具有下列六项特色。(1)文件结构只能存放一幅图像。(2)可以存储单色、16色、256色和全彩色四种图像数据。(3)图像数据可选择压缩或不压缩处理(4)Windows设计了两种压缩方式:RLE4和RLE8。RLE4处理16色图像数据;而RLE8则是压缩2
5、56图像数据。(5)图像数据排列顺序,与一般图像文件有所不同。(6)调色板的数据结构特殊。2.2灰度直方图统计的实现方法直方图均衡化过程(算法):(1)列出原始图灰度级rk;(2)统计原始直方图各灰度级像素数nk;(3)计算原始直方图各概率:pk=nk/N;(4)计算累计直方图:sk=pk;(5)取整Sk=int(L-1)sk+0.5;(6)确定映射对应关系:rksk;(7)统计新直方图各灰度级像素nk;(8)用pk (sk) =nk/N计算新直方图。利用Visual C+中提供的MFC框架设计一个简单的应用程序框架,具有图像显示,图像直方图均衡、直方图规定化、直方图、直方图均衡后图像等菜单栏
6、,再利用C+具有面向对象程序设计的性质,编写程序代码实现MFC框架中对应菜单栏中的图像处理的功能,即可得到一个简易的图像处理系统,达到课程考核题目的要求。 本次课程考核设计了一个简单的图片处理系统,主要具有以对话框的形式显示原始图片(bmp格式)、显示原图像的直方图、图像直方图均衡化、图像直方图规定化、显示均衡化和规定化处理后的直方图的功能。2.3图像的灰度变换原理灰度即使用黑色调表示物体。每个灰度对象都具有从0%(白色)到100%(黑色)的亮度值。灰度变换处理是图像增强处理技术中一种非常基础、直接的空间域图像处理方法,也是图像数字化和图像显示的一个重要组成部分。灰度变换主要针对独立的像素点进
7、行处理,通过改变原始图像数据所占有的灰度范围而使图像在视觉上得到改观。三. 课程设计的步骤和结果3.1类声明与核心算法程序代码 / 灰度均衡void CBitmapView:OnPointEqua() / 获取文档 CBitmapDoc* pDoc = GetDocument(); / 指向DIB的指针 LPSTR lpDIB; / 指向DIB象素指针 LPSTR lpDIBBits; / 锁定DIB lpDIB = (LPSTR) :GlobalLock(HGLOBAL) pDoc-GetHDIB(); / 找到DIB图像象素起始位置 lpDIBBits = :FindDIBBits(lpD
8、IB); / 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的直方图均衡,其它的可以类推) if (:DIBNumColors(lpDIB) != 256) / 提示用户 MessageBox(目前只支持256色位图的直方图均衡!, 系统提示 , MB_ICONINFORMATION | MB_OK); / 解除锁定 :GlobalUnlock(HGLOBAL) pDoc- / 返回 return; / 更改光标形状 BeginWaitCursor(); / 调用InteEqualize()函数进行直方图均衡 InteEqualize(lpDIBBits, :DIBWidth(l
9、pDIB), :DIBHeight(lpDIB); / 设置脏标记 pDoc-SetModifiedFlag(TRUE); / 更新视图UpdateAllViews(NULL); / 解除锁定 : / 恢复光标 EndWaitCursor();/* 函数名称: * InteEqualize() * * 参数: * LPSTR lpDIBBits - 指向源DIB图像指针 * LONG lWidth - 源图像宽度(象素数) * LONG lHeight - 源图像高度(象素数) * 返回值: * BOOL - 成功返回TRUE,否则返回FALSE。 * 说明: * 该函数用来对图像进行直方图均
10、衡。*/BOOL WINAPI InteEqualize(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)/ 指向源图像的指针 unsigned char* lpSrc;/ 临时变量 LONG lTemp; / 循环变量 LONG i; LONG j; / 灰度映射表 BYTE bMap256; LONG lCount256; / 图像每行的字节数 LONG lLineBytes; / 计算图像每行的字节数 lLineBytes = WIDTHBYTES(lWidth * 8); / 重置计数为0 for (i = 0; i 256; i +) / 清零
11、lCounti = 0; / 计算各个灰度值的计数 lHeight; for (j = 0; j right-(lpRect)-left)#define RECTHEIGHT(lpRect) (lpRect)-bottom-(lpRect)-top)#define WIDTHBYTES(bits) (bits)+31)/32*4)#define DIB_HEADER_MARKER (WORD)(MbiClrUsed; if(dwClrUsed) return (WORD)dwClrUsed; wBitCount=(LPBITMAPINFOHEADER)lpbi)-biBitCount; els
12、e wBitCount=(LPBITMAPCOREHEADER)lpbi)-bcBitCount; switch(wBitCount) case 1: return 2; case 4: return 16; case 8: return 256; default: return 0;WORD WINAPI PaletteSize(LPSTR lpbi) return (WORD)(DIBNumColors(lpbi)*sizeof(RGBQUAD); return (WORD)(DIBNumColors(lpbi)*sizeof(RGBTRIPLE);LPSTR WINAPI FindDIB
13、Bits(LPSTR lpbi) return (lpbi+*(LPDWORD)lpbi+:PaletteSize(lpbi);DWORD WINAPI DIBWidth(LPSTR lpDIB) LPBITMAPINFOHEADER lpbmi; LPBITMAPCOREHEADER lpbmc; lpbmi=(LPBITMAPINFOHEADER)lpDIB; lpbmc=(LPBITMAPCOREHEADER)lpDIB; if(IS_WIN30_DIB(lpDIB) return lpbmi-biWidth; return (DWORD)lpbmc-bcWidth;DWORD WINA
14、PI DIBHeight(LPSTR lpDIB)biHeight;bcHeight;BOOL WINAPI PaintDIB(HDC hDC,LPRECT lpDCRect,HDIB hDIB,LPRECT lpDIBRect,CPalette* pPal) LPSTR lpDIBHdr; BOOL bSuccess=FALSE; HPALETTE hPal=NULL; HPALETTE hOldPal=NULL; if(hDIB=NULL) return FALSE; lpDIBHdr=(LPSTR):GlobalLock(HGLOBAL)hDIB); lpDIBBits=FindDIBB
15、its(lpDIBHdr); if(pPal!=NULL) hPal=(HPALETTE)pPal-m_hObject; hOldPal=:SelectPalette(hDC,hPal,TRUE);SetStretchBltMode(hDC,COLORONCOLOR); if(RECTWIDTH(lpDCRect)=RECTWIDTH(lpDIBRect)&(RECTHEIGHT(lpDCRect)=RECTHEIGHT(lpDIBRect) bSuccess=:SetDIBitsToDevice(hDC,lpDCRect-left,lpDCRect-top,RECTWIDTH(lpDCRec
16、t),RECTHEIGHT(lpDCRect),lpDIBRect-left, (int)DIBHeight(lpDIBHdr)-lpDIBRect-top-RECTHEIGHT(lpDIBRect),0,(WORD)DIBHeight(lpDIBHdr), lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS);StretchDIBits(hDC,lpDCRect- lpDIBRect-top,RECTWIDTH(lpDIBRect),RECTHEIGHT(lpDIBRect), lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DI
17、B_RGB_COLORS,SRCCOPY);GlobalUnlock(HGLOBAL)hDIB); if(hOldPal)SelectPalette(hDC,hOldPal,TRUE); GlobalUnlock(hDIB); return bSuccess;BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette* pPal) LPLOGPALETTE lpPal; HANDLE hLogPal; LPSTR lpbi; LPBITMAPINFO lpbmi; LPBITMAPCOREINFO lpbmc; BOOL bWinStyleDIB; int
18、i; WORD wNumColors; BOOL bResult=FALSE; lpbi=(LPSTR): lpbmi=(LPBITMAPINFO)lpbi; lpbmc=(LPBITMAPCOREINFO)lpbi; wNumColors=DIBNumColors(lpbi); bWinStyleDIB=IS_WIN30_DIB(lpbi); if(wNumColors!=0) hLogPal=:GlobalAlloc(GHND,sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*wNumColors); if(hLogPal=0) : return FALSE; lpPal=(LPLOGPALETTE)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1