《数字图像》
期 末 考 试
班级: 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.选择边缘与轮廓--计算周长
因篇幅问题不能全部显示,请点此查看更多更全内容