您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > 8种常用图像处理算法(函数)
8种常用图像处理算法(函数)------以下所有函数均放在CimageProcessingView.ccp下1.图像镜像voidCCimageProcessingView::OnGeomTrpo(){//获取指向文档的指针CCimageProcessingDoc*pDoc=GetDocument();//指向DIB的指针LPSTRlpDIB;//锁定DIBlpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc-GetHDIB());//设置光标状态为等待状态BeginWaitCursor();//调用VertMirror函数镜像图象if(VertMirror(lpDIB)){//设置文档修改标记pDoc-SetModifiedFlag(TRUE);//更新所有视图pDoc-UpdateAllViews(NULL);}else{//提示信息MessageBox(实现图象镜像失败!);}//解除锁定::GlobalUnlock((HGLOBAL)pDoc-GetHDIB());//结束光标等待状态EndWaitCursor();}/***************************************************************************函数名称:**VertMirror()**参数:**LPSTRlpDIB//指向源DIB图像指针**返回值:**BOOL//镜像成功返回TRUE,否则返回FALSE。**说明:**该函数用来实现DIB图像的垂直镜像。*************************************************************************/BOOLWINAPIVertMirror(LPSTRlpDIB){//原图象宽度LONGlWidth;//原图象高度LONGlHeight;//原图象的颜色数WORDwNumColors;//原图象的信息头结构指针LPBITMAPINFOHEADERlpbmi;//指向原图象和目的图象的像素的指针LPBYTElpSrc,lpDst;//平移后剩余图像在源图像中的位置(矩形区域)CRectrectSrc;//指向原图像像素的指针LPBYTElpDIBBits;//指向复制图像像素的指针LPBYTElpNewDIBBits;//内存句柄HLOCALh;//循环变量LONGi;//图像每行的字节数LONGlLineBytes;//获取图象的信息头结构的指针lpbmi=(LPBITMAPINFOHEADER)lpDIB;//找到图象的像素位置lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);//获取图象的宽度lWidth=::DIBWidth(lpDIB);//获取图象的高度lHeight=::DIBHeight(lpDIB);//获取图象的颜色数wNumColors=::DIBNumColors(lpDIB);//计算图像每行的字节数lLineBytes=WIDTHBYTES(lWidth*(lpbmi-biBitCount));//暂时分配内存,以保存新图像h=LocalAlloc(LHND,lLineBytes);//分配内存失败,直接返回if(!h)returnFALSE;//锁定内存lpNewDIBBits=(LPBYTE)LocalLock(h);//如果是256色位图或真彩色位图if(wNumColors==256||wNumColors==0){//平移图像,每次移动一行for(i=0;ilHeight/2;i++){//指向原图象倒数第i行像素起点的指针lpSrc=(LPBYTE)lpDIBBits+lLineBytes*i;//目标区域同样要注意上下倒置的问题lpDst=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-i-1);//备份一行memcpy(lpNewDIBBits,lpDst,lLineBytes);//将倒数第i行像素复制到第i行memcpy(lpDst,lpSrc,lLineBytes);//将第i行像素复制到第i行memcpy(lpSrc,lpNewDIBBits,lLineBytes);}}else{AfxMessageBox(只支持256色和真彩色位图);//释放内存LocalUnlock(h);LocalFree(h);returnfalse;}//释放内存LocalUnlock(h);LocalFree(h);//返回returnTRUE;}2.旋转图像(含对话框这里对话框需要自己建立)voidCCimageProcessingView::OnGeomRota(){//获取指向文档的指针CCimageProcessingDoc*pDoc=GetDocument();//指向DIB的指针LPSTRlpDIB;//锁定DIBlpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc-GetHDIB());//缩放比率intiRotaAngle;//创建对话框CDlgGeoRotadlgPara;//初始化变量值dlgPara.m_iRotaAngle=90;//显示对话框,提示用户设定旋转角度if(dlgPara.DoModal()!=IDOK){//返回return;}//获取用户设定的平移量iRotaAngle=dlgPara.m_iRotaAngle;//删除对话框deletedlgPara;//创建新DIBHDIBhNewDIB=NULL;//设置光标状态为等待状态BeginWaitCursor();//调用RotateDIB函数旋转DIB图象hNewDIB=(HDIB)::RotateDIB(lpDIB,iRotaAngle);//旋转成功if(hNewDIB){//替换原来的DIB图象为新的DIBpDoc-ReplaceHDIB(hNewDIB);//更新DIB图象的大小和调色板pDoc-InitDIBData();//设置文档修改标记pDoc-SetModifiedFlag(TRUE);//调节滚动视图大小SetScrollSizes(MM_TEXT,pDoc-GetDocSize());//更新所有视图pDoc-UpdateAllViews(NULL);}else{//提示信息MessageBox(实现图象旋转失败!);}//解除锁定::GlobalUnlock((HGLOBAL)pDoc-GetHDIB());//结束光标等待状态EndWaitCursor();}/***************************************************************************函数名称:**RotateDIB()**参数:**LPSTRlpDIB//指向源DIB图像指针**intiAngle*说明:**该函数用来实现DIB图像的旋转。*************************************************************************/HGLOBALWINAPIRotateDIB(LPSTRlpDIB,intiAngle){//原图象宽度LONGlWidth;//原图象高度LONGlHeight;//旋转后图象宽度LONGlNewWidth;//旋转后图象高度LONGlNewHeight;//原图象的颜色数WORDwNumColors;//原图象的信息头结构指针LPBITMAPINFOHEADERlpbmi,lpbmi0;//指向原图象和目的图象的像素的指针LPBYTElpSrc,lpDst;//指向原图像像素的指针LPBYTElpDIBBits;//指向旋转后图像(像素)的指针LPBYTElpNewDIBBits;LPSTRlpNewDIB;//旋转后新的DIB句柄HDIBhDIB;//循环变量LONGi,j,i0,j0;//原图像每行的字节数LONGlLineBytes;//旋转后图像每行的字节数LONGlNewLineBytes;//旋转角度的弧度doublefArcAngle;//旋转角度的正弦和余弦floatfSin,fCos;//旋转前图象四个角的坐标(以图象中心为坐标系原点)floatfSrcX1,fSrcY1,fSrcX2,fSrcY2;floatfSrcX3,fSrcY3,fSrcX4,fSrcY4;//旋转后图象四个角的坐标(以图象中心为坐标系原点)floatfDstX1,fDstY1,fDstX2,fDstY2;floatfDstX3,fDstY3,fDstX4,fDstY4;//两个中间量floatf1,f2;//找到图象的像素位置lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);//获取图象的宽度lWidth=::DIBWidth(lpDIB);//获取图象的高度lHeight=::DIBHeight(lpDIB);//获取图象的颜色数wNumColors=::DIBNumColors(lpDIB);//获取指向原位图信息头结构的指针lpbmi0=(LPBITMAPINFOHEADER)lpDIB;//计算原图像每行的字节数lLineBytes=WIDTHBYTES(lWidth*(lpbmi0-biBitCount));//将旋转角度从度转换到弧度fArcAngle=(iAngle*PI)/180.0;//计算旋转角度的正弦fSin=(float)sin(fArcAngle);//计算旋转角度的余弦fCos=(float)cos(fArcAngle);//计算原图的四个角的坐标(以图像中心为坐标系原点)fSrcX1=(float)(-(lWidth-1)/2);fSrcY1=(float)((lHeight-1)/2);fSrcX2=(float)((lWidth-1)/2);fSrcY2=(float)((lHeight-1)/2);fSrcX3=(float)(-(lWidth-1)/2);fSrcY3=(float)(-(lHeight-1)/2);fSrcX4=(float)((lWidth-1)/2);fSrcY4=(float)(-(lHeight-1)/2);//计算新图四个角的坐标(以图像中心为坐标系原点)fDstX1=fCos*fSrcX1+fSin*fSrcY1;fDstY1=-fSin*fSrcX1+fCos*fSrcY1;fDstX2=fCos*fSrcX2+fSin*fSrcY2;fDstY2=-fSin*fSrcX2+fCos*fSrcY2;fDstX3=fCos*fSrcX3+fSin*fSrcY3;fDstY3=-fSin*fSrcX3+fCos*fSrcY3;fDstX4=fCos*fSrcX4+fSin*fSrcY4;fDstY4=-fSin*fSrcX4+fCos*fSrcY4;//计算旋转后的图像实际宽度lNewWidth=(LONG)(max(fabs(fDstX4-fDstX1),fabs(fDstX3-fDstX2))+0.5);//计算旋转后的图像高度lNewHeight=(LONG)(max(fabs(fDstY4-fDstY1),fabs(fDstY3-fDstY2))+0.5);//计算旋转后图像每行的字节数lNewLineBytes=WIDTHBYTES(lNewWidth*lpbmi0-biBitCount);//计算两个常数f1=(float)(-0.5*(lNewWidth-1)*fCos-0.5*(lNewHeight-1)*fSin+0.5*(lWidth-1));f2=(float)(0.5*(lNewWidth-1)*fSin-0.5*(lNewHeight-1)*fCos+0.5*(lHeight
本文标题:8种常用图像处理算法(函数)
链接地址:https://www.777doc.com/doc-4325518 .html