- 5
- 0
- 约2.3千字
- 约 6页
- 2018-10-26 发布于贵州
- 举报
图像处理实验报告书_2
实验报告单
院(系)计算机学院专业计算机科学与技术班级 12计科4
姓名郝耀峰学号同组人无
实验室S4305 组号日期2015.4.2
课程数字图像处理指导老师鲁静成绩
实验项目编号 03 试验项目名称点运算之阈值变换一、实验目的
1、参照程序中“点运算-线性变换”函数,编写完成阈值变换功能的函数OnPointThre( )和ThresholdTrans( ),并加入到程序的相应位置。
2、运行程序观察阈值变换的效果。
试验环境(仪器设备、软件等)
Windows 7 VC6.0
三、实验原理(或要求)
1、点运算实际上是灰度到灰度的映射过程,设输入图象为A(x,y),输出图象为B(x,y),则点运算可表示为
B(x,y)=f[A(x,y)]
即点运算完全由灰度映射函数s=f(r)决定。
2、阈值化处理是最常用的一种非线性运算,它的功能是选择一阈值,将图象二值化,用于图象分割及边缘跟踪等处理。
四、实验步骤
void CCh1_1View::OnPointThre()
{
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 创建对话框
CDlgLinerParadlgPara;
// 阈值变换的参数
FLOAT fA;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc-GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的线性变换,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox(目前只支持256色位图的线性变换!, 系统提示 , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc-GetHDIB());
// 返回
return;
}
// 初始化变量值
dlgPara.m_fA = 128.0;
// 显示对话框,提示用户设定阈值
if (dlgPara.DoModal() != IDOK)
{
//返回
return;
}
// 获取用户设定的阈值
fA = dlgPara.m_fA;
// 删除对话框
delete dlgPara;
// 更改光标形状
BeginWaitCursor();
// 调用ThresholdTrans( )函数进行阈值变换
thresholdTrans(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), fA);
// 设置脏标记
pDoc-SetModifiedFlag(TRUE);
// 更新视图
pDoc-UpdateAllViews(NULL);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc-GetHDIB());
// 恢复光标
EndWaitCursor();
}
BOOL WINAPI ThresholdTrans(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, BYTE bThre)
{
// 指向源图像的指针
unsigned char* lpSrc;
// 循环变量
LONG i;
LONG j;
// 图像每行的字节数
LONG lLineBytes;
// 中间变量
FLOAT fTemp;
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
// 每行
for(i = 0; ilHeight; i++)
{
// 每列
for(j = 0; j lWidth; j++)
{
// 指向DIB第i行,第j个象素的指针
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
// 阈值变换
fTemp = bThre * (*lpSrc);
// 判断是否超出范围
if
原创力文档

文档评论(0)