搜索
您的当前位置:首页正文

数字图像处理,考试试题答案

来源:意榕旅游网


《数字图像》

期 末 考 试

班级: 12级计科3班

学号: 1250312025 姓名: 郝耀峰

题 目

编写程序,读入下图并输出图中所有图形的周长,即图像边缘的长度(单位:个像素)。

1.在menu菜单栏的边缘与轮廓下加入计算周长菜单项,设置计算周长菜单项ID为ID_Perimeter

2.在edegecontour.h中加入

声明计算周长函数

long WINAPI Long(LPSTR lpDIBBits, LONG lWidth, LONG lHeight);

3.在edgecontour.cpp中加入

// **********计算周长*********************************************** long WINAPI Long(LPSTR lpDIBBits, LONG lWidth, LONG lHeight) {

// 指向源图像的指针

// 指向源图像的指针 LPSTR lpSrc;

// 指向缓存图像的指针 LPSTR lpDst;

// 指向缓存DIB图像的指针 LPSTR lpNewDIBBits; HLOCAL

hNewDIBBits;

//循环变量 long i; long j;

//像素值 double result; unsigned char pixel;

// 暂时分配内存,以保存新图像

hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);

if (hNewDIBBits == NULL) { }

// 锁定内存

lpNewDIBBits = (char * )LocalLock(hNewDIBBits);

// 分配内存失败 return 0;

// 初始化新分配的内存,设定初始值为255 lpDst = (char *)lpNewDIBBits;

memset(lpDst, (BYTE)255, lWidth * lHeight);

//灰度为0的像素点的个数

long int Total=0;

// 每行

for(i = 1; i < lHeight-1; i++) {

// 每列

for(j = 1; j < lWidth-1; j++) {

// 指向源图像倒数第j行,第i个象素的指针 lpSrc = (char *)lpDIBBits + lWidth * i + j;

//取得当前指针处的像素值,注意要转换为unsigned char型

//

图像中为0的灰度值,即黑点 if(pixel !=0)

Total+=1;

pixel = (unsigned char)*lpSrc;

} }

}

// 返回总个数,即周长 return Total;

4.在ch1_1View.cpp中声明

ON_COMMAND(ID_Perimeter,OnPerimeter)

5.在ch1_1View.cpp中加入void CCh1_1View::OnPerimeter() 方法 处理单击事件

void CCh1_1View::OnPerimeter()

{

//计算周长

// 指向DIB象素指针 LPSTR lpDIBBits;

// 锁定DIB

lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());

// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可// 获取文档

CCh1_1Doc* pDoc = GetDocument();

// 指向DIB的指针 LPSTR lpDIB;

以类推)

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))) long sum=Long(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB)*8), ::DIBHeight(lpDIB)); CString s;

s.Format(\"%ld\

MessageBox(\"边缘长度为\"+s, \"图像边缘长度\" ,MB_OK);

// 解除锁定

}

::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

// 恢复光标 EndWaitCursor();

6.在ch1_1View.h中加入声明

7.运行,打开图片,选择边缘与轮廓--边缘检测--Robert算子

得到下图。

8.选择边缘与轮廓--计算周长

因篇幅问题不能全部显示,请点此查看更多更全内容

Top