ImageVerifierCode 换一换
格式:DOCX , 页数:40 ,大小:32.24KB ,
资源ID:10059877      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10059877.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(最新数字图像处理算法实现精编版.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

最新数字图像处理算法实现精编版.docx

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

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

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

4、elsOneByOne(Gdiplus:Bitmap* const p_bitmap, Processor processor, unsigned int x, unsigned int y, unsigned int width, unsigned 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

5、rect(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; rowheight; +row) for (unsigned int col=0; colUnlockBits(&bitmapData) != Gdiplus:Ok) ret

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

7、e #include namespace nsimgtk / 8阶灰度图的灰度反转算法 class NegativeGray8 public: void operator()(unsigned char *const p_value) *p_value = 0xff; ; / 8阶灰度图的Gamma校正算法 class GammaCorrectGray8 private: unsigned char d_s256; public: GammaCorrectGray8:GammaCorrectGray8(double c, double gamma); void operator()(unsig

8、ned char*const p_value) *p_value = d_s*p_value; ; / 8阶灰度图的饱和度拉伸算法 class ContrastStretchingGray8 private: unsigned char d_s256; public: ContrastStretchingGray8:ContrastStretchingGray8(double a1, double b1, unsigned int x1, double a2, double b2, unsigned int x2, double a3, double b3); void operator()(

9、unsigned char*const p_value) *p_value = d_s*p_value; ; / 8阶灰度图的位平面分割,构造函数指定位平面号 class BitPlaneSliceGray8 private: unsigned char d_s256; public: BitPlaneSliceGray8(unsigned char bitPlaneNum); void operator()(unsigned char* const p_value) *p_value = d_s*p_value; ;#endif/ 上述类中各构造函数的实现代码,应该分在另一个文件中,此处为说

10、明方便,一并列出#include SpatialDomain/spatialDomain.hnamespace nsimgtk GammaCorrectGray8:GammaCorrectGray8(double c, double gamma) double temp; for (unsigned int i=0; i 255 | x2 255 | x1 x1) for (unsigned int i=0; i256; +i) d_si = i; else double tmp; for (unsigned int i=0; ix1; +i) tmp = ceil(a1*double(i)+

11、b1); d_si = (unsigned char)tmp; for (unsigned int i=x1; ix2; +i) tmp = ceil(a2*double(i)+b2); d_si = (unsigned char)tmp; for (unsigned int i=x2; i256; +i) tmp = ceil(a3*double(i)+b3); d_si = (unsigned char)tmp; BitPlaneSliceGray8:BitPlaneSliceGray8(unsigned char bitPlaneNum) unsigned char bitMaskArr

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

13、iplus: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, PixelFormat8bppIndexed, &bitmapDa

14、ta) != Gdiplus:Ok) return false; unsigned char *pixels = (unsigned char*)bitmapData.Scan0; unsigned int histogram256; for (int i=0; i256; +i) histogrami = 0; for (unsigned int row=0; rowGetWidth(); +row) for (unsigned int col=0; colGetHeight(); +col) +histogrampixelscol+row*bitmapData.Stride; const

15、unsigned int totalPixels = p_bitmap-GetWidth() * p_bitmap-GetHeight(); for (int i=0; iUnlockBits(&bitmapData) != Gdiplus:Ok) return false; return true; 在获取直方图后(即上面算法的第二个参数),再将其作为参数传入下面的对象的构造函数,然后以该对象为仿函数传入ProcessPixelsOneByOne即可实现8阶图像直方图均衡化:#ifndef SPATIALDOMAIN_H#define SPATIALDOMAIN_H#include #inc

16、lude namespace nsimgtk / 8阶灰度图的直方图均衡化 class HistogramEqualizationGray8 private: unsigned char d_s256; public: HistogramEqualizationGray8(const float *const histogramArray); void operator()(unsigned char *const p_value) *p_value = d_s*p_value; ;#endif /#include SpatialDomain/spatialDomain.hnamespace

17、nsimgtk HistogramEqualizationGray8:HistogramEqualizationGray8(const float *const histogramArray) if (histogramArray != NULL) float sum = 0.0; for (int i=0; i256; +i) sum += histogramArrayi; d_si = unsigned char(sum * 255); (3)空间域滤波器,滤波器是一个m*n大小的掩模,其中m,n均为大于1的 奇数。滤波器逐像素地通过图像的全部或部分矩形区域,然后逐像素地对掩模覆盖下的像素

18、使用滤波器算法获得响应,将响应赋值于当前像素即掩模中心像素,另外 滤波器算法使用中将会涉及到图像边缘的问题,这可以对边缘部分掩模使用补零法补齐掩模下无像素值的区域,或者掩模的移动范围以不越出图像边缘的方式移动, 当然这些处理方法都会给图像边缘部分带来不良效果,但是一般情况下,图像边缘部分往往不是我们关注的部分或者没有重要的信息。下面的滤波器算法框架SpatialFilterAlgo即以补零法(zero-padding)实现:#ifndef SPATIALFILTER_H#define SPATIALFILTER_H#include #include #include #include #inc

19、lude #include namespace nsimgtk template bool SpatialFilterAlgo(Gdiplus:Bitmap* const p_bitmap, FilterMask filterMask, unsigned int x, unsigned int y, unsigned int width, unsigned int height) if (p_bitmap = NULL) return false; if (width + x p_bitmap-GetWidth() | (height + y p_bitmap-GetHeight() retu

20、rn false; Gdiplus:BitmapData bitmapData; Gdiplus:Rect rect(x, y, width,height); if (p_bitmap-LockBits(&rect, Gdiplus:ImageLockModeWrite, pixelFormat, &bitmapData) != Gdiplus:Ok) return false; pixelType *pixels = (pixelType*)bitmapData.Scan0; const unsigned int m = filterMask.d_m; / masks width const

21、 unsigned int n = filterMask.d_n; / masks height std:vector tmpImage(m-1+width)*(n-1+height); / extend image to use zero-padding / copy original bitmap to extended image with zero-padding method for (unsigned int row=0; rowheight; +row) for (unsigned int col=0; colwidth; +col) tmpImage(col+m/2)+(row

22、+n/2)*(bitmapData.Stride/sizeof(pixelType)+m-1) = pixelscol+row*bitmapData.Stride/sizeof(pixelType); / process every pixel with filterMask for (unsigned int row=0; rowheight; +row) for (unsigned int col=0; colwidth; +col) / fill the m*n mask with the current pixels neighborhood for (unsigned int i=0

23、; in; +i) for (unsigned int j=0; jUnlockBits(&bitmapData) != Gdiplus:Ok) return false; return true; #endif其中模板参数FilterMask即为滤波掩模算法。通常的滤波算法有均值滤波器,可以模糊化图像,去除图形中的细节部分,使得我们可以关注图像中较为明显的部分,均值滤波器用于周期性噪声。中值滤波器用于图像中存在椒盐噪声也即脉冲噪声的情况下。另外有基于一阶微分的Sobel梯度算子和基于两阶微分的拉普拉斯算子,它们往往被用于边缘检测中。下面是一些滤波器算法的具体实现,所以滤波器算法都应该实现pi

24、xelType response()函数以及有d_mask,d_m,d_n成员,这可以通过继承_filteMask类获得(不需要付出虚函数代价)。#ifndef SPATIALFILTER_H#define SPATIALFILTER_H#include #include #include #include #include #include namespace nsimgtk / 滤波器掩模的基类,提供掩模大小d_m,d_n,掩模覆盖下的m*n个像素值d_mask / others filterMask should inherit it template struct _filterMask const unsigned int d_m; const unsigned int d_n; /

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1