《数字图像处理及应用》
课程
实验报告书
专业班级: | 21计二 |
姓 名: | 王梓权 |
学 号: | 21030228 |
指导教师: | 徐则中 |
计算机信息工程学院
《数字图像处理》实验
- 实验教学目的和要求
《数字图像处理》课程内容是一门综合性很强的专业课程。主要内容是对采集的数字图像进行处理,包括:图像变换、图像增强、图像恢复、图像分割、图像分析与理解、图像压缩等各种图像处理算法的基本理论、方法和技术。
通过本课程的学习,使学生掌握有关数字图像处理与分析的基本概念、基础理论、实用技术和典型方法。使学生了解图像变换与增强、图像分割与理解的技术方法,为将来的研究和应用打下良好的基础。
通过实验环节,加强学生对所学数字图像处理知识的深入理解,增强对数字图像处理的感性认识,掌握图像处理技术的基本实现步骤。为今后进行各种有关数字图像处理程序的编制和开发打下良好的基础。
1、掌握数字图像的基本变换,通过线性或非线性灰度变换、直方图均衡算法等,增强图像质量。
2、掌握数字图像的一般分割技术,从数字图像中提取目标对象的轮廓形状,用于进一步的分析处理。
3、掌握在Visual Studio 下用C++编写程序、调试程序,实现数字图像处理算法、开发简单的图像处理应用程序。能够对图像处理结果进行分析、评价。
二、实验项目表
序号 | 实 验 名 称 | 学时数 |
1 | 图像变换与增强 | 2 |
2 | 图像分割与理解 | 2 |
三、主要实验仪器及材料
微型计算机、Visual Studio C++编程环境。
四、考核方式
1、每一次实验指导教师应对其实际上机的预习情况、操作情况和实验报告完成情况进行综合评价,并给出综合成绩。
2、学期结束,对所有实验的成绩进行综合,其成绩作为期末成绩的一部分。
五、教材及参考书
1、R. C. Gonzalez, R. E. Woods,《数字图像处理》(第二版)北京:电子工业出版社,2003。
2、章毓晋,《数字图像处理基础教程》,北京:清华大学出版社,2012。
3、章民武,《图像处理与图像分析基础》,北京:清华大学版社,2021。
数字图像处理编程基础
一、编程框架
二、算法程序模版
灰度图像处理:
void CDipXuzzView::OnDemo()
{ //代码示例
CClientDC dc(this);
CDipXuzzDoc* pDoc = GetDocument(); //获得文档
LPSTR lpDIB; //指向DIB的指针
long lWidth, lHeight; //图像宽度和高度
LONG lLineBytes;
LPSTR lpDIBBits; //指向DIB的象素的指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
lpDIBBits = ::FindDIBBits(lpDIB);
lWidth = ::DIBWidth(lpDIB); //DIB 宽度
lHeight = ::DIBHeight(lpDIB); //DIB 高度
lLineBytes = WIDTHBYTES(lWidth * 8);
if (::DIBNumColors(lpDIB) != 256)
{
MessageBox("支持256色位图", "系统提示" , MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
unsigned char *lpSrc;
int i,j;
for(i = 0; i < lWidth; i++)
{
for(j = 0; j < lHeight; j++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 -j) +ij;
//*lpSrc ;
}
}
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
}
彩色图像处理:
void CDipXuzzView::OnDemocolor()
{
CDipXuzzDoc* pDoc = GetDocument();
LPSTR lpDIB;
LPSTR lpDIBBits;
LONG lLineBytes;
LONG lWidth,lHeight;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
lWidth = ::DIBWidth(lpDIB); //DIB 宽度
lHeight = ::DIBHeight(lpDIB); //DIB 高度
lLineBytes = WIDTHBYTES(lWidth*8*3);//真彩色一个象素为3个字节
lpDIBBits = (LPSTR)lpDIB + sizeof(BITMAPINFOHEADER);
unsigned char *ired,*igreen,*iblue;
int i,j;
for(i=0; i<lWidth; i++)
{
for(j=0; j<lHeight; j++)
{
ired = (unsigned char*)lpDIBBits + lLineBytes * (lHeight-1 - j) + i*3 + 2;
igreen = (unsigned char*)lpDIBBits + lLineBytes * (lHeight-1 - j) + i*3 + 1;
iblue = (unsigned char*)lpDIBBits + lLineBytes * (lHeight-1 - j) + i*3 + 0 ;
*ired =;
*igreen =;
*iblue =;
}
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
}
实验一 图像变换与增强
- 实验目的与要求
- 熟悉图像灰度变换的基本原理;掌握线性变换和非线性变换处理的方法;编写图像灰度变换处理的程序。
- 根据直方图均衡化的原理,设计直方图均衡化的算法,并编程实现直方图均衡化的功能。
- 加强学生运用VC++进行算法设计和编程实现的能力。
- 实验内容
- 采集两幅数字图像,图像整体偏暗、偏亮,图片类型为BMP格式。掌握图像的读写方法。
- 根据直方图均衡算法的流程,运用VC++编写程序实现图像直方图均衡算法。
- 分别对两幅图像进行增强处理,并对结果进行比较、分析,完成实验报告。
- 实验的算法、程序及结果
- 采集两幅数字图像,图像整体偏暗、偏亮,图片类型为BMP格式。掌握图像的读写方法。
2.根据直方图均衡算法的流程,运用VC++编写程序实现图像直方图均衡算法。
以下是图像灰度变换算法(核心代码):
- 暗变亮
for (i = 0; i < lWidth; i++)
{
for (j = 0; j < lHeight; j++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - j) + i;
temp = 255 - (*lpSrc - 255) * (*lpSrc - 255) / 255.0;
if (temp > 255) temp = 255;
if (temp < 0) temp = 0;
*lpSrc = temp;
dc.SetPixel(lWidth + 10 + i, j, RGB(*lpSrc, *lpSrc, *lpSrc));
}
}
- 亮变暗
for (i = 0; i < lWidth; i++)
{
for (j = 0; j < lHeight; j++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - j) + i;
temp = (*lpSrc) * (*lpSrc) / 255.0;
if (temp > 255) temp = 255;
if (temp < 0) temp = 0;
*lpSrc = temp;
dc.SetPixel(lWidth + 10 + i, j, RGB(*lpSrc, *lpSrc, *lpSrc));
}
}
3.分别对两幅图像进行增强处理,并对结果进行比较、分析,完成实验报告。
分析:⑴偏暗照片:经过代码中对lpSrc的非线性变换后可以变亮。将原本照片过暗丢失的楼房、天空以及树木等特征以较好的水平进行了还原,使照片质量得到提升。
⑵偏亮照片:经过对lpSrc的非线性变换(平方后除以255)后可以变暗。原本照片过亮,导致了景物过白而模糊以及塔身变灰(类似雾天拍摄效果),经过处理较好地还原绝大部分景物的原本状态,塔身也有了类似除雾处理的效果。
- 实验小结
本实验内容是关于对图像进行增强处理。本实验中,我选用一张自己拍摄的常州天宁宝塔照片,并使用照片编辑技术,调节照片的亮度,分别得到偏暗和偏亮的2张照片。
本实验中,我使用灰度变换算法对这两张照片进行处理,增强后的照片可以将原本因过暗、过亮而失真的照片处理到近似于原图的效果,整体看来效果较好:①.将原本照片过暗丢失的楼房、天空以及树木等特征以较好的水平进行了还原,使照片质量得到提升;②.原本照片过亮,导致了景物过白而模糊以及塔身变灰(类似雾天拍摄效果),经过处理较好地还原绝大部分景物的原本状态,塔身也有了类似除雾处理的效果。
综上所述,本实验图片增强效果符合目标要求。
实验二 图像分割与理解
- 实验目的与要求
- 熟悉数字图像分割的基本原理,掌握常用的图像阈值分割、边缘检测处理的方法。
- 根据图像分割的原理,设计图像分割算法,并编程实现。
- 利用VC++编写图像处理算法,加强学生运用VC进行算法设计和编程实现的能力。
- 实验内容
- 采集一幅个人的数字图像,图片类型为BMP格式。
- 根据图像区域分割的方法和流程,实现图像分割算法,利用VC++编写程序。
- 掌握简单的图像测量方法,在图像分割的基础上,计算个人的身高和臂长参数。
- 用所编程序对给定图像进行测试,并对结果进行分析,完成实验报告。
- 实验的算法、程序及结果
- 采集一幅个人的数字图像,图片类型为BMP格式。
-
- 根据图像区域分割的方法和流程,实现图像分割算法,利用VC++编写程序。
thr = 143;
for (i = 0; i < lWidth; i++)
{
for (j = 0; j < lHeight; j++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - j) + i;
if ((*lpSrc) > thr)
*lpSrc = 255;
else
*lpSrc = 0;
}
}
-
- 掌握简单的图像测量方法,在图像分割的基础上,计算个人的身高和臂长参数。
float calibration = 0.462;//参照量 需要用标定物确定
//寻找最上点
top = lHeight - 1;
black_pixels = 0;
for (i = 0; i < lHeight; i++)
{
black_pixels = 0;
for (j = 0; j < lWidth; j++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
{
if (*(lpSrc) == 0)//黑像素 black_pixels++;
}
}
if (black_pixels > 5)
{
top = lHeight - 1 - i;
break;
}
}
//寻找最下点
bottom = 0;
black_pixels = 0;
for (i = 0; i < lHeight; i++)
{
black_pixels = 0;
for (j = 0; j < lWidth; j++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * i + j;
{
if (*(lpSrc) == 0)//黑像素 black_pixels++;
}
}
if (black_pixels > 5)
{
bottom = i;
break;
}
}
BHeight = (top - bottom) * calibration;
//寻找最左点
left = 0;
for (j = 0; j < lWidth; j++)
{
black_pixels = 0;
for (i = 0; i < lHeight; i++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * i + j;
{
if (*(lpSrc) == 0)//黑像素 black_pixels++;
}
}
if (black_pixels > 5)
{
left = j;
break;
}
}
//寻找最右点
right = 0;
for (j = lWidth - 1; j >= 0; j--)
{
black_pixels = 0;
for (i = 0; i < lHeight; i++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * i + j;
{
if (*(lpSrc) == 0)//黑像素 black_pixels++;
}
}
if (black_pixels > 5)
{
right = j;
break;
}
}
BLength = (right - left) * calibration;
CString sgbc;
CClientDC dc(this);
sgbc.Format("身高=%4.3f cm", BHeight);
dc.TextOut(200, lWidth + 30, sgbc); //列 行值
sgbc.Format("臂长=%4.3f cm", BLength);
dc.TextOut(400, lWidth + 30, sgbc);
-
- 用所编程序对给定图像进行测试,并对结果进行分析,完成实验报告。
分析:图像经过灰度化和阈值分割处理后,可以较容易地找出测量所需的4个点,最终通过调整参照量的大小,确认人像的身高臂长。
- 实验小结
本实验首先对目标的彩色照片灰度化,接着对灰度照片进行阈值分割(选定好thr),目的是将图片进行黑白化(即把像素点亮度划分为仅有0和255组成的效果),其次是寻找人物图像的最高点、最低点、最左端和最右端,并通过调整参照量的大小,最终确认出人物的身高与臂长,并在照片下方显示出来。
综上所述,本实验图片测量数据符合真实情况,能够准确反映真实值。
期末考试答案