常用图像处理算法.docx
- 文档编号:11046689
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:45
- 大小:23.36KB
常用图像处理算法.docx
《常用图像处理算法.docx》由会员分享,可在线阅读,更多相关《常用图像处理算法.docx(45页珍藏版)》请在冰豆网上搜索。
常用图像处理算法
8种常用图像处理算法(函数)
------以下所有函数均放在CimageProcessingView.ccp下
1.图像镜像
voidCCimageProcessingView:
:
OnGeomTrpo()
{
//获取指向文档的指针
CCimageProcessingDoc*pDoc=GetDocument();
//指向DIB的指针
LPSTRlpDIB;
//锁定DIB
lpDIB=(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;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; //锁定DIB lpDIB=(LPSTR): : GlobalLock((HGLOBAL)pDoc->GetHDIB()); //缩放比率 intiRotaAngle; //创建对话框 CDlgGeoRotadlgPara; //初始化变量值 dlgPara.m_iRotaAngle=90; //显示对话框,提示用户设定旋转角度 if(dlgPara.DoModal()! =IDOK) { //返回 return; } //获取用户设定的平移量 iRotaAngle=dlgPara.m_iRotaAngle; //删除对话框 deletedlgPara; //创建新DIB HDIBhNewDIB=NULL; //设置光标状态为等待状态 BeginWaitCursor(); //调用RotateDIB函数旋转DIB图象 hNewDIB=(HDIB): : RotateDIB(lpDIB,iRotaAngle); //旋转成功 if(hNewDIB) { //替换原来的DIB图象为新的DIB pDoc->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-1)); //暂时分配内存,以保存新图像 hDIB=(HDIB): : GlobalAlloc(GHND,lNewHeight*lNewLineBytes+ *(LPDWORD)lpDIB+: : PaletteSize(lpDIB)); //分配内存失败,直接返回 if(! hDIB) returnNULL; //锁定内存 lpNewDIB=(LPSTR): : GlobalLock((HGLOBAL)hDIB); //复制DIB信息头和调色板 memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB+: : PaletteSize(lpDIB)); //获取图象的信息头结构的指针 lpbmi=(LPBITMAPINFOHEADER)lpNewDIB; //更新DIB图象的高度和宽度 lpbmi->biWidth=lNewWidth; lpbmi->biHeight=lNewHeight; //找到新DIB像素的起始位置 lpNewDIBBits=(LPBYTE): : FindDIBBits(lpNewDIB); //如果是256色位图 if(wNumColors==256) { //旋转后图像每行 for(i=0;i { //旋转后图象每列 for(j=0;j { //指向图象第i行第j个像素的指针 lpDst=(LPBYTE)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+j; //计算每个像素点在原图象中的坐标 i0=(LONG)(-((float)j)*fSin+((float)i)*fCos+f2+0.5); j0=(LONG)(((float)j)*fCos+((float)i)*fSin+f1+0.5); //判断是否在源图象范围之内 if((j0>=0)&&(j0 { //指向源DIB图象第i0行,第j0个象素的指针 lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+j0; //复制象素 *lpDst=*lpSrc; } else { //对于源图中没有的象素,直接赋值为255 *((LPBYTE)lpDst)=255; } } } } //如果是24位真彩色位图 elseif(wNumColors==0) { //旋转后图像每行 for(i=0;i { //旋转后图象每列 for(j=0;j { //指向图象第i行第j个像素的指针 lpDst=(LPBYTE)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+3*j; //计算每个像素点在原图象中的坐标 i0=(LONG)(-((float)j)*fSin+((float)i)*fCos+f2+0.5); j0=(LONG)(((float)j)*fCos+((float)i)*fSin+f1+0.5); //判断是否在源图象范围之内 if((j0>=0)&&(j0 { //指向源DIB图象第i0行,第j0个象素的指针 lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+3*j0; //复制象素 memcpy(lpDst,lpSrc,3); } else { //对于源图中没有的象素,直接赋值为255 memset(lpDst,255,3); } } } } else { AfxMessageBox("只支持256色和真彩色位图"); //释放内存 GlobalUnlock(hDIB); GlobalFree(hDIB); returnNULL; } //返回 returnhDIB; } 3.图像缩放(对话框自己建立) voidCCimageProcessingView: : OnGeomZoom() { //TODO: Addyourcommandhandlercodehere //图像缩放 //获取文档 CCimageProcessingDoc*pDoc=GetDocument(); //指向DIB的指针 LPSTRlpDIB; //锁定DIB lpDIB=(LPSTR): : GlobalLock((HGLOBAL)pDoc->GetHDIB()); //缩放比率 floatfXZoomRatio; floatfYZoomRatio; //创建对话框 CDlgGeoZoomdlgPara; //初始化变量值 dlgPara.m_XZoom=0.5; dlgPara.m_YZoom=0.5; //显示对话框,提示用户设定平移量 if(dlgPara.DoModal()! =IDOK) { //返回 return; } //获取用户设定的平移量 fXZoomRatio=dlgPara.m_XZoom; fYZoomRatio=dlgPara.m_YZoom; //删除对话框 deletedlgPara; //创建新DIB HDIBhNewDIB=NULL; //更改光标形状 BeginWaitCursor(); //调用ZoomDIB()函数转置DIB hNewDIB=(HDIB)ZoomDIB(lpDIB,fXZoomRatio,fYZoomRatio); //判断缩放是否成功 if(hNewDIB! =NULL) { //替换DIB,同时释放旧DIB对象 pDoc->ReplaceHDIB(hNewDIB); //更新DIB大小和调色板 pDoc->InitDIBData(); //设置脏标记 pDoc->SetModifiedFlag(TRUE); //重新设置滚动视图大小 SetScrollSizes(MM_TEXT,pDoc->GetDocSize()); //更新视图 pDoc->UpdateAllViews(NULL); } else { //提示用户 MessageBox("分配内存失败! ","系统提示",MB_ICONINFORMATION|MB_OK); } //解除锁定 : : GlobalUnlock((HGLOBAL)pDoc->GetHDIB()); //恢复光标 EndWaitCursor(); } /************************************************************************* * *函数名称: *ZoomDIB() * *参数: *LPSTRlpDIB-指向源DIB的指针 *floatfXZoomRatio-X轴方向缩放比率 *floatfYZoomRatio-Y轴方向缩放比率 * *返回值: *HGLOBAL-缩放成功返回新DIB句柄,否则返回NULL。 * *说明: *该函数用来缩放DIB图像,返回新生成DIB的句柄。 * ************************************************************************/ HGLOBALWINAPIZoomDIB(LPSTRlpDIB,floatfXZoomRatio,floatfYZoomRatio) { //源图像的宽度和高度 LONGlWidth; LONGlHeight; //缩放后图像的宽度和高度 LONGlNewWidth; LONGlNewHeight; WORDwNumColors; //缩放后图像的宽度(lNewWidth',必须是4的倍数) LONGlNewLineBytes; //指向源图像的指针 LPBYTElpDIBBits; //指向源象素的指针 LPBYTElpSrc; //缩放后新DIB句柄 HDIBhDIB; //指向缩放图像对应象素的指针 LPBYTElpDst; //指向缩放图像的指针 LPSTRlpNewDIB; LPBYTElpNewDIBBits; //指向BITMAPINFO结构的指针(Win3.0) LPBITMAPINFOHEADERlpbmi,lpbmi0; //指向BITMAPCOREINFO结构的指针 LPBITMAPCOREHEADERlpbmc; //循环变量(象素在新DIB中的坐标) LONGi; LONGj; //象素在源DIB中的坐标 LONGi0; LONGj0; //图像每行的字节数 LONGlLineBytes; //找到源DIB图像象素起始位置 lpDIBBits=(LPBYTE): : FindDIBBits(lpDIB); //获取图像的宽度 lWidth=: : DIBWidth(lpDIB); //获取图像的高度 lHeight=: : DIBHeight(lpDIB); wNumColors=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 常用 图像 处理 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)