常用图像处理算法.docx

上传人:b****8 文档编号:11046689 上传时间:2023-02-24 格式:DOCX 页数:45 大小:23.36KB
下载 相关 举报
常用图像处理算法.docx_第1页
第1页 / 共45页
常用图像处理算法.docx_第2页
第2页 / 共45页
常用图像处理算法.docx_第3页
第3页 / 共45页
常用图像处理算法.docx_第4页
第4页 / 共45页
常用图像处理算法.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

常用图像处理算法.docx

《常用图像处理算法.docx》由会员分享,可在线阅读,更多相关《常用图像处理算法.docx(45页珍藏版)》请在冰豆网上搜索。

常用图像处理算法.docx

常用图像处理算法

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=0)&&(i0

{

//指向源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=0)&&(i0

{

//指向源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=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

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

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