// 指向源图像倒数第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(\
MessageBox(\边缘长度为\图像边缘长度\
// 解除锁定
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标 EndWaitCursor();
6.在ch1_1View.h中加入声明
7.运行,打开图片,选择边缘与轮廓--边缘检测--Robert算子
得到下图。
8.选择边缘与轮廓--计算周长