您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 商业计划书 > 数字图像处理领域的二十四个典型算法及vc实现(1)
数字图像处理领域的二十四个典型算法及vc实现、第一章一、256色转灰度图二、Walsh变换三、二值化变换四、阈值变换五、傅立叶变换六、离散余弦变换数字图像处理领域的二十四个典型算法及vc实现、第二章七、高斯平滑八、图像平移九、图像缩放十、图像旋转数字图像处理领域的二十四个典型算法及vc实现、第三章图像处理,是对图像进行分析、加工、和处理,使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,因而图像处理很多情况下指数字图像处理。本文接下来,简单粗略介绍下数字图像处理领域中的24个经典算法,然后全部算法用vc实现。由于篇幅所限,只给出某一算法的主体代码。ok,请细看。一、256色转灰度图算法介绍(百度百科):什么叫灰度图?任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:1.浮点算法:Gray=R*0.3+G*0.59+B*0.112.整数方法:Gray=(R*30+G*59+B*11)/1003.移位方法:Gray=(R*28+G*151+B*77)8;4.平均值法:Gray=(R+G+B)/3;5.仅取绿色:Gray=G;通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。灰度分为256阶。所以,用灰度表示的图像称作灰度图。程序实现:ok,知道了什么叫灰度图,下面,咱们就来实现此256色灰度图。这个Convert256toGray(),即是将256色位图转化为灰度图:voidConvert256toGray(HDIBhDIB){LPSTRlpDIB;//由DIB句柄得到DIB指针并锁定DIBlpDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);//指向DIB象素数据区的指针LPSTRlpDIBBits;//指向DIB象素的指针BYTE*lpSrc;//图像宽度LONGlWidth;//图像高度LONGlHeight;//图像每行的字节数LONGlLineBytes;//指向BITMAPINFO结构的指针(Win3.0)LPBITMAPINFOlpbmi;//指向BITMAPCOREINFO结构的指针LPBITMAPCOREINFOlpbmc;//获取指向BITMAPINFO结构的指针(Win3.0)lpbmi=(LPBITMAPINFO)lpDIB;//获取指向BITMAPCOREINFO结构的指针lpbmc=(LPBITMAPCOREINFO)lpDIB;//灰度映射表BYTEbMap[256];//计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板inti,j;for(i=0;i256;i++){//计算该颜色对应的灰度值bMap[i]=(BYTE)(0.299*lpbmi-bmiColors[i].rgbRed+0.587*lpbmi-bmiColors[i].rgbGreen+0.114*lpbmi-bmiColors[i].rgbBlue+0.5);//更新DIB调色板红色分量lpbmi-bmiColors[i].rgbRed=i;//更新DIB调色板绿色分量lpbmi-bmiColors[i].rgbGreen=i;//更新DIB调色板蓝色分量lpbmi-bmiColors[i].rgbBlue=i;//更新DIB调色板保留位lpbmi-bmiColors[i].rgbReserved=0;}//找到DIB图像象素起始位置lpDIBBits=::FindDIBBits(lpDIB);//获取图像宽度lWidth=::DIBWidth(lpDIB);//获取图像高度lHeight=::DIBHeight(lpDIB);//计算图像每行的字节数lLineBytes=WIDTHBYTES(lWidth*8);//更换每个象素的颜色索引(即按照灰度映射表换成灰度值)//逐行扫描for(i=0;ilHeight;i++){//逐列扫描for(j=0;jlWidth;j++){//指向DIB第i行,第j个象素的指针lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;//变换*lpSrc=bMap[*lpSrc];}}//解除锁定::GlobalUnlock((HGLOBAL)hDIB);}变换效果(以下若无特别说明,图示的右边部分都是为某一算法变换之后的效果):二、Walsh变换算法介绍:有关Walsh变换的深入介绍,请看此论文:程序实现:函数名称:WALSH()参数:double*f-指向时域值的指针double*F-指向频域值的指针r-2的幂数返回值:无。说明:该函数用来实现快速沃尔什-哈达玛变换。VOIDWINAPIWALSH(double*f,double*F,intr){//沃尔什-哈达玛变换点数LONGcount;//循环变量inti,j,k;//中间变量intbfsize,p;double*X1,*X2,*X;//计算快速沃尔什变换点数count=1r;//分配运算所需的数组X1=newdouble[count];X2=newdouble[count];//将时域点写入数组X1memcpy(X1,f,sizeof(double)*count);//蝶形运算for(k=0;kr;k++){for(j=0;j1k;j++){bfsize=1(r-k);for(i=0;ibfsize/2;i++){p=j*bfsize;X2[i+p]=X1[i+p]+X1[i+p+bfsize/2];X2[i+p+bfsize/2]=X1[i+p]-X1[i+p+bfsize/2];}}//互换X1和X2X=X1;X1=X2;X2=X;}//调整系数for(j=0;jcount;j++){p=0;for(i=0;ir;i++){if(j&(1i)){p+=1(r-i-1);}}F[j]=X1[p]/count;}//释放内存deleteX1;deleteX2;}函数名称:DIBWalsh1()参数:LPSTRlpDIBBits-指向源DIB图像指针LONGlWidth-源图像宽度(象素数)LONGlHeight-源图像高度(象素数)返回值:BOOL-成功返回TRUE,否则返回FALSE。说明:该函数用来对图像进行沃尔什-哈达玛变换。于上面不同的是,此处是将二维矩阵转换成一个列向量,然后对该列向量进行一次一维沃尔什-哈达玛变换。BOOLWINAPIDIBWalsh1(LPSTRlpDIBBits,LONGlWidth,LONGlHeight){//指向源图像的指针unsignedchar*lpSrc;//循环变量LONGi;LONGj;//进行付立叶变换的宽度和高度(2的整数次方)LONGw;LONGh;//中间变量doubledTemp;intwp;inthp;//图像每行的字节数LONGlLineBytes;//计算图像每行的字节数lLineBytes=WIDTHBYTES(lWidth*8);//赋初值w=1;h=1;wp=0;hp=0;//计算进行离散余弦变换的宽度和高度(2的整数次方)while(w*2=lWidth){w*=2;wp++;}while(h*2=lHeight){h*=2;hp++;}//分配内存double*f=newdouble[w*h];double*F=newdouble[w*h];//列for(i=0;iw;i++){//行for(j=0;jh;j++){//指向DIB第j行,第i个象素的指针lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*(lHeight-1-j)+i;//给时域赋值f[j+i*w]=*(lpSrc);}}//调用快速沃尔什-哈达玛变换WALSH(f,F,wp+hp);//列for(i=0;iw;i++){//行for(j=0;jh;j++){//计算频谱dTemp=fabs(F[i*w+j]*1000);//判断是否超过255if(dTemp255){//对于超过的,直接设置为255dTemp=255;}//指向DIB第j行,第i个象素的指针lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*(lHeight-1-j)+i;//更新源图像*(lpSrc)=(BYTE)(dTemp);}}//释放内存deletef;deleteF;//返回returnTRUE;}变换效果:三、二值化变换算法描述:二值化是图像分割的一种方法。在二值化图象的时候把大于某个临界灰度值的像素灰度设为灰度極大值,把小于这个值的像素灰度设为灰度極小值,从而实现二值化。根据阈值选取的不同,二值化的算法分为固定阈值和自适应阈值。比较常用的二值化方法则有:双峰法、P参数法、迭代法和OTSU法等。程序实现:voidCMyDIPView::OnDraw(CDC*pDC){CMyDIPDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);if(pDoc-m_hDIB==NULL)return;//TODO:adddrawcodefornativedatahereinti,j;unsignedchar*lpSrc;LPSTRlpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc-m_hDIB);intcxDIB=(int)::DIBWidth(lpDIB);//SizeofDIB-xintcyDIB=(int)::DIBHeight(lpDIB);//SizeofDIB-yLPSTRlpDIBBits=::FindDIBBits(lpDIB);//计算图像每行的字节数longlLineBytes=WIDTHBYTES(cxDIB*8);//每行for(i=0;icyDIB;i++){//每列for(j=0;jcxDIB;j++){//指向DIB第i行,第j个象素的指针lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*(cyDIB-1-i)+j;//计算新的灰度值//*(lpSrc)=BYTE(255-*lpSrc);}}::GlobalUnlock((HGLOBAL)pDoc-m_hDIB);CRectrect(0,0,cxDIB,cyDIB),rcDIB(0,0,cxDIB,cyDIB);::PaintDIB(pDC-m_hDC,&rect,pDoc-m_hDIB,&rcDIB,pDoc-m_palDIB);}voidCMyDIPView::OnMenuitem32778(){//TODO:Addyourcommandhandlercodehereinti,j;unsignedchar*lpSrc;CMyDIPDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);if(pDoc-m_hDIB==NULL)return;LPSTRlpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc-m_hDIB);LPSTRlpDIBBits=::FindDIBBits(lpDIB);intcxDIB=(int)::DIBWidth(lpDIB);//SizeofDIB-xintcyDIB=(int)::DIBHeight(lpDIB);//SizeofDIB-ylonglLineBytes=WIDTHBYTES(cxDIB*8);//计
本文标题:数字图像处理领域的二十四个典型算法及vc实现(1)
链接地址:https://www.777doc.com/doc-5009813 .html