数字图像处理考试试题答案.docx
《数字图像处理考试试题答案.docx》由会员分享,可在线阅读,更多相关《数字图像处理考试试题答案.docx(8页珍藏版)》请在冰豆网上搜索。
数字图像处理考试试题答案
《数字图像》
期
末
考
试
班级:
12级计科3班
学号:
1250312025
姓名:
郝耀峰
题目
编写程序,读入下图并输出图中所有图形的周长,即图像边缘的长度(单位:
个像素)。
1.在menu菜单栏的边缘与轮廓下加入计算周长菜单项,设置计算周长菜单项ID为ID_Perimeter
2.在edegecontour.h中加入
声明计算周长函数
longWINAPILong(LPSTRlpDIBBits,LONGlWidth,LONGlHeight);
3.在edgecontour.cpp中加入
//**********计算周长***********************************************
longWINAPILong(LPSTRlpDIBBits,LONGlWidth,LONGlHeight)
{
//指向源图像的指针
//指向源图像的指针
LPSTRlpSrc;
//指向缓存图像的指针
LPSTRlpDst;
//指向缓存DIB图像的指针
LPSTRlpNewDIBBits;
HLOCALhNewDIBBits;
//循环变量
longi;
longj;
//像素值
doubleresult;
unsignedcharpixel;
//暂时分配内存,以保存新图像
hNewDIBBits=LocalAlloc(LHND,lWidth*lHeight);
if(hNewDIBBits==NULL)
{
//分配内存失败
return0;
}
//锁定内存
lpNewDIBBits=(char*)LocalLock(hNewDIBBits);
//初始化新分配的内存,设定初始值为255
lpDst=(char*)lpNewDIBBits;
memset(lpDst,(BYTE)255,lWidth*lHeight);
//灰度为0的像素点的个数
longintTotal=0;
//每行
for(i=1;i{
//每列
for(j=1;j{
//指向源图像倒数第j行,第i个象素的指针
lpSrc=(char*)lpDIBBits+lWidth*i+j;
//取得当前指针处的像素值,注意要转换为unsignedchar型
pixel=(unsignedchar)*lpSrc;
//图像中为0的灰度值,即黑点
if(pixel!
=0)
Total+=1;
}
}
//返回总个数,即周长
returnTotal;
}
4.在ch1_1View.cpp中声明ON_COMMAND(ID_Perimeter,OnPerimeter)
5.在ch1_1View.cpp中加入voidCCh1_1View:
:
OnPerimeter()方法
处理单击事件
voidCCh1_1View:
:
OnPerimeter()
{
//计算周长
//获取文档
CCh1_1Doc*pDoc=GetDocument();
//指向DIB的指针
LPSTRlpDIB;
//指向DIB象素指针
LPSTRlpDIBBits;
//锁定DIB
lpDIB=(LPSTR):
:
GlobalLock((HGLOBAL)pDoc->GetHDIB());
//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)
if(:
:
DIBNumColors(lpDIB)!
=256)
{
//提示用户
MessageBox("目前只支持256色位图的运算!
","系统提示",MB_ICONINFORMATION|MB_OK);
//解除锁定
:
:
GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
//返回
return;
}
//更改光标形状
BeginWaitCursor();
//找到DIB图像象素起始位置
lpDIBBits=:
:
FindDIBBits(lpDIB);
//调用RobertDIB()函数对DIB进行边缘检测
//if(RobertDIB(lpDIBBits,WIDTHBYTES(:
:
DIBWidth(lpDIB)*8),:
:
DIBHeight(lpDIB)))
longsum=Long(lpDIBBits,WIDTHBYTES(:
:
DIBWidth(lpDIB)*8),:
:
DIBHeight(lpDIB));
CStrings;
s.Format("%ld",sum);
MessageBox("边缘长度为"+s,"图像边缘长度",MB_OK);
//解除锁定
:
:
GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
//恢复光标
EndWaitCursor();
}
6.在ch1_1View.h中加入声明
7.运行,打开图片,选择边缘与轮廓--边缘检测--Robert算子
得到下图。
8.选择边缘与轮廓--计算周长