数字图像处理算法实现_第1页
数字图像处理算法实现_第2页
数字图像处理算法实现_第3页
数字图像处理算法实现_第4页
数字图像处理算法实现_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数字图像处理算法实现编程心得(1)2001414 班 朱伟 20014123摘要:关于空间域图像处理算法框架,直方图处理,空间域滤波器算法框架的编 程心得,使用GDI+(C+)一,图像文件的读取初学数字图像处理时,图像文件的读取往往是一件麻烦的事情, 我们要面对 各种各样的图像文件格式,如果仅用C+的fstream库那就必须了解各种图像编 码格式,这对于初学图像处理是不太现实的,需要一个能帮助轻松读取各类图像文件的库。在 Win32平台上GDI+(C+)是不错的选择,不光使用上相对于 Win32 GDI要容易得多,而且也容易移植到.Net平台上的GDI+。Gdiplus:Bitmap类为我们提

2、供了读取各类图像文件的接口,Bitm ap:LockBits 方法产生的Bit map Data类也为我们提供了高速访问图像文件 流的途径。这样我们就可以将精力集中于图像处理算法的实现,而不用关心各种图像编码。具体使用方式请参考 MSDI中GDI+文档中关于Bit map类和Bitm apData 类的说明。另外GDI+仅在 WindowsXP/2003上获得直接支持,对于 Windows2000 必须安装相关 DLL,或者安装有 Office 2003 ,Visual Studio 2003 .Net 等软 件。二,空间域图像处理算法框架(1) 在空间域图像处理中,对于一个图像我们往往需要对

3、其逐个像素的进行处 理,对每个像素的处理使用相同的算法(或者是图像中的某个矩形部分)。即, 对于图像f(x,y),其中0Wx M,0 y N,图像为M*N大小,使用算法algo,则 f(x,y) = algo(f(x,y) 。事先实现一个算法框架,然后再以函数指针或函数对 象(functor,即实现operator。的对象)传入算法,可以减轻编程的工作量。如下代码便是一例:#ifndef PROCESSALGO_H#define PROCESSALGO_H#include #include namespace nsimgtktemplate bool ProcessPixelsOneByOne

4、 (Gdiplus : Bitmap* const p_bitmap , Processor processor , unsigned int x, unsigned int unsigned int width , unsigned int height )if ( p_bitmap = NULL)return falseif (width + x p_bitmap - GetWidth ()| (height + y p_bitmap- GetHeight ()return false ;Gdiplus : BitmapData bitmapData ;Gdiplus : Rect rec

5、t (x, y , width , height );if (p_bitmap - LockBits (&rect , Gdiplus : ImageLockModeWrite , pixelFormat , &bitmapData ) != Gdiplus : Ok) return false ;pixelType * pixels = (pixelType *) bitmapData . Scan0;for (unsigned int row =0; row height ; +row)for (unsigned int col =0; col UnlockBits (&bitmapDat

6、a ) != Gdiplus : Ok)return false ;return true ;#endifProcessPixelsOneByOne函数可以对图像中从(x,y)位置起始,width*height 大 小的区域进行处理。模板参数pixelType用于指定像素大小,例如在Win32平台 上传入unsigned char即为8位,用于8阶灰度图。模板参数 Processor为图像 处理算法实现,可以定义类实现void operator(pixelType *)函数,或者传入同样接口的函数指针。如下便是一些算法示例(说明见具体注释):#ifndef SPATIALDOMAIN_H#de

7、fine SPATIALDOMAIN_H#include #include namespace nsimgtk/ 8 阶灰度图的灰度反转算法class NegativeGray8public :void operator ()( unsigned char * const p_value )* p_value 人=Oxff ;;/ 8 阶灰度图的Gamm校正算法class GammaCorrectGray8private :unsigned char d_s 256;public :GammaCorrectGray8: GammaCorrectGray8( double c , double

8、gamma;void operator ()( unsigned char * const p_value )* p_value = d_s * p_value ;;/ 8阶灰度图的饱和度拉伸算法class ContrastStretchingGray8private :unsigned char d_s 256;public :ContrastStretchingGray8 : ContrastStretchingGray8 (double al , double bl , unsigned intx1,double a2 , double b2, unsigned int x2 , dou

9、ble a3 , double b3);void operator ()( unsigned char * const p_value )* p_value = d_s * p_value ;/ 8阶灰度图的位平面分割,构造函数指定位平面号class BitPlaneSliceGray8private :unsigned char d_s 256;public :BitPlaneSliceGray8 (unsigned char bitPlaneNum );void operator ()( unsigned char * const p_value )* p_value = d_s * p_

10、value ;#endif/上述类中各构造函数的实现代码,应该分在另一个文件中,此处为说明方便,一并列岀#include SpatialDomain/spatialDomain.hnamespace nsimgtkGammaCorrectGray8: GammaCorrectGray8( double c, double gammadouble temp;for (unsigned int i =0; i 255 | x2 255 | x1 x1 )for (unsigned int i =0; i 256; +i)d_s i = i ;elsedouble tmp ;for (unsigne

11、d int i =0; i x1; +i)tmp = ceil ( a1*double (i)+ b1); d_s i = (unsigned char)tmp;for(unsigned int i =x1; i x2; +i)tmp = ceil ( a2*double (i)+ b2);d_s i = (unsigned char)tmp; for(unsigned int i =x2; i 256; +i )tmp = ceil ( a3*double (i)+ b3);d_s i = (unsigned char)tmp;BitPlaneSliceGray8 : BitPlaneSli

12、ceGray8 (unsigned char bitPlaneNum )unsigned char bitMaskArray 8=0x01, 0x02, 0x04, 0x08,0x10, 0x20, 0x40, 0x80;for (unsigned int i =0; i bitPlaneNum ) * 255;d_s i = tmp ;(2) 直方图在GDI+1.0中没有获得支持,我们必须自行实现。直方图相关的处理 在数字图像处理中占有重要地位,可以通过它获取图像灰度级的统计信息,且可 以通过直方图进行一些重要的图像增强技术,如直方图均衡化,直方图规定化, 基本全局门限等。下面是获取8阶图像

13、直方图的算法实现:namespace nsimgtkbool GetHistogramNormalizeGray8 (Gdiplus : Bitmap * const p_bitmap , float *histogramArray ) if ( p_bitmap = NULL | histogramArray = NULL)return false ;Gdiplus : BitmapData bitmapData ;Gdiplus : Rect rect (0, 0, p_bitmap -GetWidth (), p_bitmap -GetHeight ();if (p_bitmap -Lo

14、ckBits (&rect , Gdiplus : ImageLockModeRead PixelFormat8bpplndexed ,&bitmapData ) != Gdiplus : Ok)return false ;unsigned char * pixels = (unsigned char *) bitmapData . Scan0;unsigned int histogram 256;for (int i =0; i 256; +i )histogram i =0;for (unsigned int row =0; row GetWidth (); +row)for (unsig

15、ned int col =0; col GetHeight (); +col)+histogram pixels col +row* bitmapData . Stride ;const unsigned int totalPixels = p_bitmap - GetWidth () * p_bitmap - GetHeight ();for (int i =0; i UnlockBits (&bitmapData ) != Gdiplus : Ok)return false ;return true ;在获取直方图后(即上面算法的第二个参数),再将其作为参数传入下面的对象的 构造函数,然后

16、以该对象为仿函数传入 ProcessPixelsOneByOne即可实现8阶图 像直方图均衡化:#ifndef SPATIALDOMAIN_H#define SPATIALDOMAIN_H#include #include namespace nsimgtk/ 8阶灰度图的直方图均衡化class HistogramEqualizationGray8private :unsigned char d_s 256;public :HistogramEqualizationGray8 (const float * const histogramArray );void operator ()( uns

17、igned char * const p_value )* p_value = d_s * p_value ;#endif/#include SpatialDomain/spatialDomain.hnamespace nsimgtkHistogramEqualizationGray8 : HistogramEqualizationGray8 (const float * const histogramArray ) if ( histogramArray != NULL)float sum = 0.0 ;for (int i =0; i 256; + )sum += histogramArr

18、ay i ;d_s i = unsigned char ( sum * 255);(3) 空间域滤波器,滤波器是一个m*n大小的掩模,其中m,n均为大于1的 奇数。 滤波器逐像素地通过图像的全部或部分矩形区域,然后逐像素地对掩模覆盖下的像素使用滤波器算法获得响应,将响应赋值于当前像素即掩模中心像素,另外 滤 波器算法使用中将会涉及到图像边缘的问题,这可以对边缘部分掩模使用补零法补齐掩模下无像素值的区域,或者掩模的移动范围以不越出图像边缘的方式移 动,当然这些处理方法都会给图像边缘部分带来不良效果,但是一般情况下, 图像边缘部分往往不是我们关注的部分或者没有重要的信息。下面的滤波器算法框架Spa

19、tialFilterAlgo 即以补零法(zero-padding)实现:#ifndef SPATIALFILTER_H#define SPATIALFILTER_H#include #include #include #include #include #include namespace nsimgtktemplate bool SpatialFilterAlgo (Gdiplus : Bitmap * const p_bitmap , FilterMask filterMask , unsigned intx, unsigned int y,unsigned int width , un

20、signed int height )if ( p_bitmap = NULL)return false ;if ( width + x p_bitmap - GetWidth ()|(height + y p_bitmap - GetHeight ()return false ;Gdiplus : BitmapData bitmapData ;Gdiplus : Rect rect (x, y , width , height );if (p_bitmap - LockBits (&rect , Gdiplus : ImageLockModeWrite , pixelFormat ,&bit

21、mapData ) != Gdiplus : Ok)return false ;pixelType * pixels = (pixelType *) bitmapData . ScanO;constunsignedint m = filterMask.d_m/masks widthconstunsignedint n = filterMask.d_n;/masks heightstd:vector vpixelType tmpImage (m 1 +width )*( n-1 +height );/ extend image to usezero-padding/ copy original

22、bitmap to extended image with zero-padding methodfor (unsigned int row =0; row vheight ; +row)for (unsigned int col =0; col width ; +col)tmpImage( col +m/ 2)+( row+n/ 2)*( bitmapData . Stride / sizeof ( pixelType )+m1) = pixels col +row* bitmapData . Stride / sizeof ( pixelType );/ process every pix

23、el with filterMaskfor (unsigned int row =0; row vheight ; +row)for (unsigned int col =0; col width ; +col)/ fill the m*n mask with the current pixels neighborhoodfor (unsigned int i =0; i n; +i)for (unsigned int j =0; j UnlockBits (&bitmapData ) != Gdiplus : Ok)return false ;return true ;#endif其中模板参

24、数FilterMask即为滤波掩模算法。通常的滤波算法有均值滤波器, 可以模糊化图像,去除图形中的细节部分,使得我们可以关注图像中较为明显的 部分,均值滤波器用于周期性噪声。中值滤波器用于图像中存在椒盐噪声也即脉 冲噪声的情况下。另外有基于一阶微分的Sobel梯度算子和基于两阶微分的拉普 拉斯算子,它们往往被用于边缘检测中。下面是一些滤波器算法的具体实现,所以滤波器算法都应该实现pixelTyperesponse()函数以及有d_mask,d_m,d_n成员,这可以通过继承 _filteMask类获得(不需要付出虚函数代价)。一一#ifndef SPATIALFILTER_H#define S

25、PATIALFILTER_H#include #include #include #include #include #include namespace nsimgtk/滤波器掩模的基类,提供掩模大小d_m,d_n,掩模覆盖下的 m*n个像素值d_mask/ others filterMask should inherit ittemplate struct _filterMaskconst unsigned int d_m;const unsigned int d_n;/ images pixels under the m*n filter maskstd : vector vpixelT

26、ype d_mask;/ filter masks width and heigh must be a odd, if not, it will plus one for the widthor the height_filterMask(unsigned int m, unsigned int n)d_m(mf% ? m: m+1), d_n(n%2? n:n+1), d_mask(d_nfd_n);/掩模权值为全1的均值滤波器template class averagingFilterMaskSp(unsigned int m, unsigned int n):public _filter

27、Mask public : averagingFilterMaskSp:_filterMask (m n)pixelType response()return std : accumulate ( d_mask begin (), d_mask. end(), 0) / (d_m * d_n );;可自定义掩模权值的均值滤波器template class averagingFilterMask:public _filterMaskprivate :std : vector d_weight ;/ weights vector(m*n)int d_weight_sum ;/ all weight

28、s sumpublic :averagingFilterMask(unsigned int m, unsigned int n, const std : vector &weightVec ):_filterMask(m n), d_weight (weightVec )if (weightVec . size ()!= d_mask. size ()/ if weights size isnt equal to masks size, it will change filter mask asa special filter maskd_weight. resize (d_mask size

29、 (),1);d_weight_sum= std : accumulate (d_weight . begin (), d_weight . end(), 0);pixelType response().begin (),0) /return std : inner_product (d_mask. begin (), d_mask. end(), d_weight d_weight_sum;/中值滤波器template class medianFilterMask:public _filterMaskpublic :medianFilterMask (unsigned int m, unsi

30、gned int n):_filterMask(m n) pixelType response()std: sort (d_mask. begin (), d_mask. end();return d_mask d_mask. size ()/ 2;/ 3*3 拉普拉斯滤波器/ the mask is: 0 1 00 -1 0/1 -5 1 or -1 5 -1/ 0 1 0 0 -1 0/ if pixels brightness is less than min, set it to min/ if pixels brightness is larger than max, set it

31、to maxtemplate class laplacianFilter:public _filterMaskpublic :laplacianFilter():_filterMask(3, 3) pixelType response()int ret = (int )( 5*( int ) d_mask 4)-(int ) d_mask 5+ d_mask 3+ d_mask 1+ d_mask 7);if(ret max)ret=max;return ret;/ 3*3Sobel 滤波器/ the mask is: -1 -2 -1-1 0 1/0 0 0 and -2 0 2/ 1 2

32、1 -1 0 1/ if pixels brightness is larger than max, set it to max template class sobelFilter:public _filterMaskpublic :sobelFilter():_filterMask(3, 3) pixelType response()int ret = : abs(d_masK 6+2*d_masl 7+d_mask 8- d_mask0- 2* d_mask 1 - d_masl2)+ : abs(d_masl 2+2*d_masK 5+d_mask 8- d_mask 0- 2* d_

33、mask3- d_masl 6);if (ret max)ret= max;return ret ;#endif数字图像处理算法实现 编程心得(1)2001414 班 朱伟 20014123摘要:关于空间域图像处理算法框架,直方图处理,空间域滤波器算法框架的编 程心得,使用GDI+(C+)一,图像文件的读取初学数字图像处理时,图像文件的读取往往是一件麻烦的事情,我们要面对各种各样的图像文件格式,如果仅用C+勺fstream库那就必须了解各种图像编 码格式,这对于初学图像处理是不太现实的,需要一个能帮助轻松读取各类图像文件的库。在 Win32平台上GDI+(C+)是不错的选择,不光使用上相对于

34、Win32 GDI要容易得多,而且也容易移植到.Net平台上的GDI+。Gdiplus:Bitmap类为我们提供了读取各类图像文件的接口,Bitm ap:LockBits 方法产生的Bit map Data类也为我们提供了高速访问图像文件 流的途径。这样我们就可以将精力集中于图像处理算法的实现,而不用关心各种图像编码。具体使用方式请参考 MSDI中GDI+文档中关于Bit map类和Bitm apData 类的说明。另外GDI+仅在 WindowsXP/2003上获得直接支持,对于 Windows2000 必须安装相关 DLL,或者安装有 Office 2003 ,Visual Studio

35、2003 .Net 等软 件。二,空间域图像处理算法框架(1) 在空间域图像处理中,对于一个图像我们往往需要对其逐个像素的进行处 理,对每个像素的处理使用相同的算法(或者是图像中的某个矩形部分)。即, 对于图像f(x,y),其中0Wx M,0 y N,图像为M*N大小,使用算法algo,则 f(x,y) = algo(f(x,y)。事先实现一个算法框架,然后再以函数指针或函数对象(functor,即实现operator。的对象)传入算法,可以减轻编程的工作量。如下代码便是一例:#ifndefPROCESSALGO_H#define PROCESSALGO_H#include #include

36、namespace nsimgtktemplate bool ProcessPixelsOneByOne (Gdiplus : Bitmap* const p_bitmap , Processor processor , unsigned int x, unsigned int unsigned int width , unsigned int height )if ( p_bitmap = NULL)return false ;if ( width + x p_bitmap - GetWidth ()|(height + y p_bitmap - GetHeight ()return fal

37、se ;GdiplusBitmapData bitmapDataGdiplus : Rect rect (x, y , width , height );if (p_bitmap - LockBits (&rect , Gdiplus : ImageLockModeWrite , pixelFormat , &bitmapData ) != Gdiplus : Ok)return false ;pixelType * pixels = (pixelType *) bitmapData . ScanO;for (unsigned int row =0; row height ; +row)for

38、 (unsigned int col =0; col UnlockBits (&bitmapData ) != Gdiplus : Ok)return false ;return true ;#endifProcessPixelsOneByOne函数可以对图像中从(x,y)位置起始,width*height 大 小的区域进行处理。模板参数pixelType用于指定像素大小,例如在Win32平台 上传入unsigned char即为8位,用于8阶灰度图。模板参数 Processor为图像 处理算法实现,可以定义类实现void operator(pixelType *)函数,或者传入同样接口的函数

39、指针。如下便是一些算法示例(说明见具体注释):#ifndef SPATIALDOMAIN_H#define SPATIALDOMAIN_H#include #include namespace nsimgtk/ 8阶灰度图的灰度反转算法class NegativeGray8public :void operator ()( unsigned char * const p_value )* p_value 人=Oxff ;;/ 8阶灰度图的Gamm校正算法class GammaCorrectGray8private :unsigned char d_s 256;public :GammaCorr

40、ectGray8: GammaCorrectGray8( double c , double gamma;void operator ()( unsigned char * const p_value )* p_value = d_s * p_value ;;/ 8阶灰度图的饱和度拉伸算法class ContrastStretchingGray8private :unsigned char d_s 256;public :ContrastStretchingGray8 : ContrastStretchingGray8 (double al , double bl , unsigned int

41、x1,double a2 , double b2, unsigned int x2 , double a3 , double b3);void operator ()( unsigned char * const p_value )* p_value = d_s * p_value ;/ 8阶灰度图的位平面分割,构造函数指定位平面号class BitPlaneSliceGray8private :unsigned char d_s 256;public :BitPlaneSliceGray8 (unsigned char bitPlaneNum );void operator ()( unsi

42、gned char * const p_value )* p_value = d_s * p_value ;;#endif/上述类中各构造函数的实现代码,应该分在另一个文件中,此处为说明方便,一并列岀#include SpatialDomain/spatialDomain.hnamespace nsimgtkGammaCorrectGray8: GammaCorrectGray8( double c, double gammadouble temp;for (unsigned int i =0; i 255 | x2 255 | x1 x1 )for (unsigned int i =0; i

43、 256; +i)d_s i = i ;elsedouble tmp ;for(unsignedint i =0; ix1; +i)tmp = ceil(a1*double (i)+b1);d_s i =(unsignedchar) tmp;for(unsignedint i =x1;i x2; +i)tmp = ceil ( a2*double (i)+ b2); d_s i = (unsigned char)tmp;for(unsigned int i =x2; i 256; +i )tmp = ceil ( a3*double (i)+ b3);d_s i = (unsigned cha

44、r)tmp;BitPlaneSliceGray8 : BitPlaneSliceGray8 (unsigned char bitPlaneNum )unsigned char bitMaskArray 8=0x01, 0x02, 0x04, 0x08,0x10, 0x20, 0x40, 0x80;for (unsigned int i =0; i bitPlaneNum ) * 255;d_s i = tmp ;(2) 直方图在GDI+1.0中没有获得支持,我们必须自行实现。直方图相关的处理 在数字图像处理中占有重要地位,可以通过它获取图像灰度级的统计信息,且可 以通过直方图进行一些重要的图像

45、增强技术,如直方图均衡化,直方图规定化, 基本全局门限等。下面是获取8阶图像直方图的算法实现:namespace nsimgtkbool GetHistogramNormalizeGray8 (Gdiplus : Bitmap * const p_bitmap , float *histogramArray ) if ( p_bitmap = NULL | histogramArray = NULL)return false ;Gdiplus : BitmapData bitmapData ;Gdiplus : Rect rect (0, 0, p_bitmap -GetWidth (), p_bitmap -GetHeight ();if (p_bitmap -LockBits (&rect , Gdiplus : ImageLockModeRead PixelFormat8bpplndexed ,&bitmapData ) != Gdiplus : Ok)return false ;unsigned char * p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论