最新数字图像处理算法实现精编版Word文档下载推荐.docx
- 文档编号:5943530
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:40
- 大小:32.24KB
最新数字图像处理算法实现精编版Word文档下载推荐.docx
《最新数字图像处理算法实现精编版Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《最新数字图像处理算法实现精编版Word文档下载推荐.docx(40页珍藏版)》请在冰点文库上搜索。
#ifndefPROCESSALGO_H
#definePROCESSALGO_H
#include<
windows.h>
Gdiplus.h>
namespacensimgtk
{
template<
typenamepixelType,Gdiplus:
PixelFormatpixelFormat,classProcessor>
boolProcessPixelsOneByOne(Gdiplus:
Bitmap*constp_bitmap,Processorprocessor,unsignedintx,unsignedinty,
unsignedintwidth,unsignedintheight)
{
if(p_bitmap==NULL)
{
returnfalse;
}
if((width+x>
p_bitmap->
GetWidth())||(height+y>
p_bitmap->
GetHeight()))
BitmapDatabitmapData;
Gdiplus:
Rectrect(x,y,width,height);
if(p_bitmap->
LockBits(&
rect,Gdiplus:
ImageLockModeWrite,pixelFormat,&
bitmapData)!
=Gdiplus:
Ok)
pixelType*pixels=(pixelType*)bitmapData.Scan0;
for(unsignedintrow=0;
row<
height;
++row)
for(unsignedintcol=0;
col<
width;
++col)
{
processor(&
pixels[col+row*bitmapData.Stride/sizeof(pixelType)]);
}
if(p_bitmap->
UnlockBits(&
returntrue;
}
}
#endif
ProcessPixelsOneByOne函数可以对图像中从(x,y)位置起始,width*height大小的区域进行处理。
模板参数pixelType用于指定像素大小,例如在Win32平台上传入unsignedchar即为8位,用于8阶灰度图。
模板参数Processor为图像处理算法实现,可以定义类实现voidoperator(pixelType*)函数,或者传入同样接口的函数指针。
如下便是一些算法示例(说明见具体注释):
#ifndefSPATIALDOMAIN_H
#defineSPATIALDOMAIN_H
cmath>
string>
//8阶灰度图的灰度反转算法
classNegativeGray8
public:
voidoperator()(unsignedchar*constp_value)
*p_value^=0xff;
};
//8阶灰度图的Gamma校正算法
classGammaCorrectGray8
private:
unsignedchard_s[256];
GammaCorrectGray8:
GammaCorrectGray8(doublec,doublegamma);
voidoperator()(unsignedchar*constp_value)
*p_value=d_s[*p_value];
//8阶灰度图的饱和度拉伸算法
classContrastStretchingGray8
ContrastStretchingGray8:
ContrastStretchingGray8(doublea1,doubleb1,unsignedintx1,
doublea2,doubleb2,unsignedintx2,doublea3,doubleb3);
//8阶灰度图的位平面分割,构造函数指定位平面号
classBitPlaneSliceGray8
BitPlaneSliceGray8(unsignedcharbitPlaneNum);
voidoperator()(unsignedchar*constp_value)
//上述类中各构造函数的实现代码,应该分在另一个文件中,此处为说明方便,一并列出
#include"
SpatialDomain/spatialDomain.h"
GammaCorrectGray8:
GammaCorrectGray8(doublec,doublegamma)
doubletemp;
for(unsignedinti=0;
i<
256;
++i)
temp=ceil(c*255.0*pow(double(i)/255.0,gamma));
d_s[i]=unsignedchar(temp);
ContrastStretchingGray8:
doublea2,doubleb2,unsignedintx2,doublea3,doubleb3)
if(x1>
255||x2>
255||x1>
x1)
for(unsignedinti=0;
d_s[i]=i;
else
doubletmp;
x1;
tmp=ceil(a1*double(i)+b1);
d_s[i]=(unsignedchar)tmp;
for(unsignedinti=x1;
x2;
tmp=ceil(a2*double(i)+b2);
for(unsignedinti=x2;
tmp=ceil(a3*double(i)+b3);
BitPlaneSliceGray8:
BitPlaneSliceGray8(unsignedcharbitPlaneNum)
unsignedcharbitMaskArray[8]=
0x01,0x02,0x04,0x08,
0x10,0x20,0x40,0x80
};
unsignedchartmp=i;
tmp&
=bitMaskArray[bitPlaneNum];
tmp=(tmp>
>
bitPlaneNum)*255;
d_s[i]=tmp;
(2)直方图在GDI+1.0中没有获得支持,我们必须自行实现。
直方图相关的处理在数字图像处理中占有重要地位,可以通过它获取图像灰度级的统计信息,且可以通过直方图进行一些重要的图像增强技术,如直方图均衡化,直方图规定化,基本全局门限等。
下面是获取8阶图像直方图的算法实现:
boolGetHistogramNormalizeGray8(Gdiplus:
Bitmap*constp_bitmap,float*histogramArray)
if(p_bitmap==NULL||histogramArray==NULL)
Rectrect(0,0,p_bitmap->
GetWidth(),p_bitmap->
GetHeight());
ImageLockModeRead,PixelFormat8bppIndexed,&
unsignedchar*pixels=(unsignedchar*)bitmapData.Scan0;
unsignedinthistogram[256];
for(inti=0;
histogram[i]=0;
for(unsignedintrow=0;
GetWidth();
GetHeight();
++histogram[pixels[col+row*bitmapData.Stride]];
constunsignedinttotalPixels=p_bitmap->
GetWidth()*p_bitmap->
histogramArray[i]=float(histogram[i])/float(totalPixels);
在获取直方图后(即上面算法的第二个参数),再将其作为参数传入下面的对象的构造函数,然后以该对象为仿函数传入ProcessPixelsOneByOne即可实现8阶图像直方图均衡化:
//8阶灰度图的直方图均衡化
classHistogramEqualizationGray8
HistogramEqualizationGray8(constfloat*consthistogramArray);
#endif
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HistogramEqualizationGray8:
HistogramEqualizationGray8(constfloat*consthistogramArray)
if(histogramArray!
=NULL)
floatsum=0.0;
for(inti=0;
sum+=histogramArray[i];
d_s[i]=unsignedchar(sum*255);
}
(3)空间域滤波器,滤波器是一个m*n大小的掩模,其中m,n均为大于1的奇数。
滤波器逐像素地通过图像的全部或部分矩形区域,然后逐像素地对掩模覆盖下的像素使用滤波器算法获得响应,将响应赋值于当前像素即掩模中心像素,另外滤波器算法使用中将会涉及到图像边缘的问题,这可以对边缘部分掩模使用补零法补齐掩模下无像素值的区域,或者掩模的移动范围以不越出图像边缘的方式移动,当然这些处理方法都会给图像边缘部分带来不良效果,但是一般情况下,图像边缘部分往往不是我们关注的部分或者没有重要的信息。
下面的滤波器算法框架SpatialFilterAlgo即以补零法(zero-padding)实现:
#ifndefSPATIALFILTER_H
#defineSPATIALFILTER_H
vector>
numeric>
algorithm>
gdiplus.h>
fstream>
PixelFormatpixelFormat,classFilterMask>
boolSpatialFilterAlgo(Gdiplus:
Bitmap*constp_bitmap,FilterMaskfilterMask,unsignedintx,unsignedinty,
constunsignedintm=filterMask.d_m;
//mask'
swidth
constunsignedintn=filterMask.d_n;
sheight
std:
vector<
pixelType>
tmpImage((m-1+width)*(n-1+height));
//extendimagetousezero-padding
//copyoriginalbitmaptoextendedimagewithzero-paddingmethod
tmpImage[(col+m/2)+(row+n/2)*(bitmapData.Stride/sizeof(pixelType)+m-1)]=
pixels[col+row*bitmapData.Stride/sizeof(pixelType)];
//processeverypixelwithfilterMask
//fillthe"
m*n"
maskwiththecurrentpixel'
sneighborhood
for(unsignedinti=0;
n;
for(unsignedintj=0;
j<
m;
++j)
filterMask.d_mask[i*m+j]=tmpImage[(col+j)+(row+i)*(bitmapData.Stride/sizeof(pixelType)+m-1)];
//replacethecurrentpixelwithfiltermask'
sresponse
pixels[col+row*bitmapData.Stride/sizeof(pixelType)]=filterMask.response();
其中模板参数FilterMask即为滤波掩模算法。
通常的滤波算法有均值滤波器,可以模糊化图像,去除图形中的细节部分,使得我们可以关注图像中较为明显的部分,均值滤波器用于周期性噪声。
中值滤波器用于图像中存在椒盐噪声也即脉冲噪声的情况下。
另外有基于一阶微分的Sobel梯度算子和基于两阶微分的拉普拉斯算子,它们往往被用于边缘检测中。
下面是一些滤波器算法的具体实现,所以滤波器算法都应该实现pixelTyperesponse()函数以及有d_mask,d_m,d_n成员,这可以通过继承__filteMask类获得(不需要付出虚函数代价)。
//滤波器掩模的基类,提供掩模大小d_m,d_n,掩模覆盖下的m*n个像素值d_mask
//othersfilterMaskshouldinheritit
typenamepixelType>
struct__filterMask
constunsignedintd_m;
constunsignedintd_n;
//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 数字图像 处理 算法 实现 精编