数字图像处理实验报告

时间:2024.4.20

数字图像处理实验报告

姓 名: 罗靓 学 号: 0103120614 班 级: 地理信息系统1201 指导教师: 梅小明

地球科学与信息物理学院 20xx年5月24日

Visual C++ 数字图像处理

一、程序功能

视觉是人类从大自然中获取信息的最重要的手段,而图像正是人类获取视觉信息的主要途径。所谓图像处理,就是对图像信息进行加工以满足人的视觉心理或应用需求的行为。

本数字图像处理系统主要分为:

(1)图像的读取

图像在显示屏的显示时采用扫描的方式:电子枪每次从左到右扫描一行,为每个像素着色,然后在像这样从上到下扫描整个屏幕,利用人眼的视觉暂留效应就可以显示出一屏完整的图像。

一个BMP文件大体上可以分为位图文件头(BITMAPFILEHEADER),位图信息头(BITMAPINFOHEADER),调色板(Palette),DIB图像数据。所以我们可以根据DIB读取图像信息,从而进行图像的读取。因此建立一个DIB库。

(2)图像信息的读取

主要是根据读取BITMAPINFOHEADER中的信息获取图像中的信息。

(3)灰度直方图

灰度直方图是属于点运算的,但是由于当时创建菜单的时候的失误将其放入了查看的选项中。

灰度直方图是灰度值的函数,描述的是图像中具体该灰度值得像素的个数,其横坐标表示像素的灰度级别,纵坐标是该灰度出现的频率(像素的个数)。

(4)点运算

点运算主要是针对图像的像素进行加、减、乘、除等运算。图像的点运算可以有效地改变图像的直方图分布,这对提高图像的分辨率以及图像均衡都是非常有益。本系统中关于点运算有:图像反色,线性变换和灰度均衡

(5)图像增强

图像增强的作用主要是突出图像中重要的信息,同时减弱或去除不需要的信息。常用方法有直方图增强和伪彩色增强等。

本系统主要有直方图增强还有图像的平滑和锐化。

(6)边缘与轮廓

图像的边缘是图像的最基本特征。所谓边缘就是指其周围像素灰度有阶跃变化或屋顶变化的那些像素的集合。物体的边缘是由灰度不连续性所反映的。经典的边缘提取方法是考察图像的每个像素在某个领域内灰度的变化,利用边缘邻接一阶或二阶方向导数变化规律,用简单的方法检测边缘。这种方法称为边缘检测

局部算子法。

边缘检测算子检查每个像素的领域并对灰度变化率进行量化,与包括方向的确定。大部分是试用基于方向导数掩膜求卷积的方法。

由于大致格式一样,只是模板有些不同,所以该程序只写了Roberts边缘检测算子。

(7)图像变换

数字图像处理的方法主要有两类:空间域处理法及频域法。点运算是在空间域中进行图像处理的。本系统中傅立叶变换就是一种频域的变化。傅立叶变换是十九世纪数学界和工程界最辉煌的成果之一。它一直是信号处理领域中最完美、应用最广泛、效果最好的一种分析手段。它也是线性系统分析的有利工具,它使人们能够定量地分析诸如数字系统、采样点、电子放大器、卷积、滤波、噪声、显示点等的作用。把傅立叶变换理论同其物理解释相结合,将大大有助于解决大多数图像处理问题。

傅立叶变换使人们从空间域(或时域)与频率域两个不同的角度来看待信号或图像的问题。有时在时域无法解决的问题,在频域却是显而易见的。

二、实验环境

VC6.0

三、实验过程

(1)图像的读取

编写自己的文档程序,能读取BMP图像(采用DIB)。

1.打开VC++6.0,构建自己的DIB函数库,输完后保存为相应的*.h或*.cpp。

2.新建工程,各个步骤用缺省设置。

3.具体程序实现,参考书本中的使用DIB读写BMP文件示例。

DIB库中主要是包括下面几个函数。

PaintDIB() - 绘制DIB对象

CreateDIBPalette() - 创建DIB对象调色板

FindDIBBits() - 返回DIB图像象素起始位置

DIBWidth() - 返回DIB宽度

DIBHeight() - 返回DIB高度

PaletteSize() - 返回DIB调色板大小

DIBNumColors() - 计算DIB调色板颜色数目

CopyHandle() - 拷贝内存块

SaveDIB() - 将DIB保存到指定文件中

ReadDIBFile() - 重指定文件中读取DIB对象

DIBToPCX256()

ReadPCX256() - 将指定的256色DIB对象保存为256色PCX文件 - 读取256色PCX文件

在实现这些函数的时候主要是用到了几个Windows支持的重要的DIB访问函数,通过这些函数能够很好地获取图像和图像信息。

SetDIBitsToDevice()可以直接在显示器或打印机上显示DIB,显示时不进行缩放处理。

StretchDIBits ()可以缩放显示DIB于显示器和打印机上。

FindDIBits()找到DIB图像像素的起始位置。

SelectPalette()选中调色板 等……

完善DIB库后,再通过添加一些MFC的代码,就可以实现图像的读取了。

(2)图像信息的读取

实现该功能的时候主要是利用到了DIB本身有一个包含图像基本信息的图像信息头BITMAPINFOHEADER。通过访问BITMAPINFOHEADER,就可以把文件的一些基本信息读出。这里只读取了图像的大小,长度和宽度。

Cdlgproperties dlgproper;

BITMAPINFOHEADER *lpbit; lpbit = (LPBITMAPINFOHEADER)lpDIB; dlgproper.m_size=lpbit->biSizeImage; dlgproper.lpdib=lpDIB; dlgproper.m_height=::DIBHeight(lpDIB); dlgproper.m_width=::DIBWidth(lpDIB);

(3)灰度直方图

要在对话框中绘制图像的灰度直方图,首先必须得到图像像素的指针(保存在类成员变量m_lpDIBBits中)和图像的高度和宽度信息(保存在类成员变量m_lHeight和m_lWidth中)

数字图像处理实验报告

。有了这些信息,就可以计算各个灰度的像素数(保

存在类成员变量m_lCount[256]数组中)。因为各个灰度级的计数不同,所以某些灰度的计数可能远远大于其他的灰度计数,所以定义两个成员变量来保存用户的设置:m_iLowGray保存用户指定查看区间的起始灰度;m_iUpGray保存查看区间的上限。

1.在原来程序上添加一对话框:ResourceView->Dialog,右键->Insert…->Dialog->New.

2.右击对话框->属性,修改相应的ID及名称

3.添加相应的控件:三个静态文本控件,二个编辑箱控件,OK及Cancel控件保留,为了布局,拖到下面。

4.创建新类,右键对话框,-> ClassWizard,输入类名:CdlgIntensity

5.映射类CDlgIntensiy的消息和添加类CDlgIntensiy的成员变量。包括:(OnInitDialog;OnKillfocusEDITLowGray; OnKillfocusEDITUpGray;

OnLButtonDown;OnLButtonUp;OnMouseMove;OnOK;OnPaint)及(m_iLowGray和m_iUpGray)两部分内容。

6.添加直方图菜单项

7.编写各个函数的代码

(4)点运算

具体的MFC的对话框建立与菜单添加过程和灰度直方图的相似,就不再说明。

1.灰度的线性变换就是将图像中的所有的点的灰度按照线性会的变换函数进行变换。DB?f(DA)?fA?DA?fB参数fA是线性函数的斜率,fB为线性函数的在y轴的截距,DA表示输入图像的灰度,DB表示输出图像的灰度。当fA>1时,输出图像的对比度增大;当fA<1时,输出的图像的对比度将减小;当fA = 1,fB = 0时,操作仅使所有像素的灰度值上移或者下移,其效果就是整个图像更暗或者更亮;如果

fA < 0,暗区域将变亮,亮区域变暗;当fA = -1,fB = 255

数字图像处理实验报告

时,输出的

图像的灰度正好反转。

其中本人将LinerTrans(),InteEqualize()放在了dibapi.cpp中 lpSrc = (unsigned char*)lpDIBBits + lLineBytes *

(lHeight - 1 - i) + j;

fTemp = fA * (*lpSrc) + fB;

2.灰度均衡

主要是使输入的图像转换为在每个灰度级上有相同的像素点数的输出图像。这个和上课的直方图均衡还是有一定的差别。

for (i = 0; i < lHeight; i++) { for (j = 0; j < lWidth; j++) { lpSrc = (unsigned char*) lpDIBBits + lLineBytes * *lpSrc = bMap[*lpSrc]; for (i = 0; i < 256; i++) { lTemp = 0; for (j = 0; j <=i; j++) { } bMap[i]= (BYTE) (lTemp * 255 / lHeight /lWidth); lTemp += lCount[j]; for (i = 0; i < lHeight; i++) { for (j = 0; j < lWidth; j++) { } lpSrc = (unsigned char*) lpDIBBits - lLineBytes * i + j; lCount[*(lpSrc)]++; } 主要是读出输入图像的每个灰度级上有多少个像素。 } 统计一共有多少像素值然后做像素值的平均化 (lHeight - 1 -i) + j;

} } 将算出的新的像素值付给相对应的灰度级

图像反色

线性变换

灰度均衡

(5)图像增强

具体的MFC的对话框建立与菜单添加过程和灰度直方图的相似,就不再说明。

图像的平滑和锐化是图像增强的常用方法。这里主要写了中值滤波和梯度锐化。

中值滤波:

for(i = iFilterMY; i < lHeight - iFilterH + iFilterMY + 1; i++)

{ for(j = iFilterMX; j < lWidth - iFilterW + iFilterMX + 1; j++) { lpDst = (unsigned char*)lpNewDIBBits + lLineBytes * for (k = 0; k < iFilterH; k++) { for (l = 0; l < iFilterW; l++) { lpSrc = (unsigned char*)lpDIBBits + lLineBytes *

数字图像处理实验报告

(lHeight - 1 - i) + j; (lHeight - 1 - i + iFilterMY - k) + j - iFilterMX + l;

} } aValue[k * iFilterW + l] = *lpSrc;

* lpDst = GetMedianNum(aValue, iFilterH * iFilterW);

主要是进行行和列的循环,然后再通过指针将相应的像素值保存在数组中,然后用GetMedianNum()得到中值,然后为该像素的值。

中值滤波3*3

梯度锐化:

for(i = 0; i < lHeight; i++) { for(j = 0; j < lWidth; j++) {

数字图像处理实验报告

lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight lpSrc1 = (unsigned char*)lpDIBBits + lLineBytes * (lHeight lpSrc2 = (unsigned char*)lpDIBBits + lLineBytes * (lHeight bTemp = abs((*lpSrc)-(*lpSrc1)) + - 1 - i) + j; - 2 - i) + j; - 1 - i) + j + 1; abs((*lpSrc)-(*lpSrc2)); if (bTemp < 255) { } if (bTemp >= bThre) { } *lpSrc = bTemp;

} } else { } *lpSrc = 255;

主要是将该点的像素值与周围的对比,如果变化的较大超出阈值,那么就是边缘赋值255,如果不是则取原来的像素值。

梯度锐化

(6)边缘与轮廓

具体的MFC的对话框建立与菜单添加过程和灰度直方图的相似,就不再说明。

由于各个算子只是模板不同,这里只做了Roberts边缘检测算子。Roberts边缘检测算子是利用局部查分算子寻找边缘的算子。

for (j = lHeight - 1; j > 0; j--){

for (i = 0; i < lWidth - 1; i++){

lpSrc = (char*) lpDIBBits + lWidth * j + i;

lpDst = (char*) lpNewDIBBits + lWidth * j + i; pixel[0] = (unsigned char)* lpSrc;

pixel[1] = (unsigned char)* (lpSrc + 1);

pixel[2] = (unsigned char)* (lpSrc - lWidth); pixel[3] = (unsigned char)* (lpSrc - lWidth + 1);

result = sqrt((pixel[0] - pixel[3]) * (pixel[0] - pixel[3]) +

(pixel[1] - pixel[2]) * (pixel[1] - pixel[2]));

数字图像处理实验报告

*lpDst = (unsigned char) result;

}

}

Roberts算子

(7)图像变换

具体的MFC的对话框建立与菜单添加过程和灰度直方图的相似,就不再说明。

傅立叶变换确实很麻烦呀!于是就照着书上敲!自己看代码的结论就是主要是运用了傅立叶函数。由于是实在有一些看不懂,所以在此不做太多的说明。

傅立叶

四、实验中遇到的问题

1.照着书也总是敲错代码!

一个很严重的问题呀!所以改程序的时间远远比敲代码的时间多得多。后来发现,你开始定义的变量最好还是复制粘贴比较好,这样出的错误会少很多。

2.直方图均衡书上的和老师将的不怎么一样。于是老师所讲的直方图均衡化应该怎么实现也是一个困扰的问题。

3.在做图像信息的读取中,我不知道为什么我的图像的大小居然读不出来!宽度和高度都出来了。一大串一大串的代码让我解决不了这个问题……

4.在做傅立叶变换的时候,虽然我确实不怎么懂傅立叶,但是……这个complex是复数我还是知道的,然后你就要定义一个头文件。但是当我把傅立叶的函数加入到dibapi.cpp中却不能运行,居然说complex没有定义,不得已,我就新建了一个傅立叶类,终于他就好了!

数字图像处理实验报告

数字图像处理实验报告

至于原因我现在也还是不知道,教训

倒是有了。

五、实验结论

这次数字图像处理的实验简直是受益匪浅。

大一下学期的C++程序设计的MFC简直是一个水字了得。所以当数字图像处理要用到MFC的时候简直要傻了。幸好老师给了一个建议教程,再凭借回忆和强大的网络,终于搞懂了那个对话框怎么生成,怎么能够点击菜单弹出一个对话框了,所以以后再也不怕做MFC了。

大二上学了一门课程叫面向对象程序设计。自己的编程确实很渣。而且自己不怎么会主动去编程。而这次的课程的面向对象的思想那是分量十足。自己开始并没有去意识到这一点,所以说各种函数在各种位置,有的时候自己要找某些函数的位置都找不到,所以,这个是这次编程的一个重大的教训。而且我想当初我的傅立叶过不了就是因为没有面向对象吧。

另外一个关于编程的东西那就是变量和函数的命名。像以往都不会可以去在乎命名的规范性,可能是xxxx_1、xxxx_2等等,这样子。现在发现命名的规范性很重要,通过相对含义的命名,就可以知道函数和变量的意思,方便自己和查看的人的查找和理解,特别是在工程很大、很复杂的时候。

此外,在课堂上学习了数字图像的处理,也看了一下老师给的效果图,觉得也就那样吧,当自己真正要去敲代码的时候,发现你要考虑的事情很多很多。比如在刚开始的图像的读取中,你就要判断是不是BMP图像呀,然后处理的过程中,你一定要考虑处理后的像素值是不是在0-255之间,超出范围了你应该怎么处理。所以想问题一定要周全。其次就是不要把问题想得太复杂,也不要把问题想得太简单。当时做完了图像的读取之后,老师要求我们把图像的具体信息读出来,当时就傻了,咦,这个应该怎么读,而且觉得应该很难。但是后来通过做后续的实验,那些也需要图像的原始的信息的时候发现其实就只要访问BITMAPFILEHEADER就可以了,瞬间就觉得简单了,虽然还有问题没有解决,但是至少是有了一份努力解决问题的信心了。

此外,通过这次实验,也知道了一种改善图像的视觉效果的方法。对以后的作图等各种东西还是有帮助的,也可以用自己做的程序来一个灰度图像均衡改善视觉效果,也可以在这些算法上做一定的改进。

总而言之,要学习的东西还有很多,在学习中进步。不要太小看任何问题,也不要夸大任何困难。

更多相关推荐:
数字图像处理 实验报告(完整版)

数字图像处理实验一MATLAB数字图像处理初步一显示图像1利用imread函数读取一幅图像假设其名为lilytif存入一个数组中2利用whos命令提取该读入图像flowertif的基本信息3利用imshow函数...

图像恢复(数字图像处理实验报告)

数字图像处理作业图像恢复摘要数字图像恢复是数字图像处理的一个基本的和重要的课题它是后期图像处理分析和理解的前提图像在摄取传输储存的过程中不可避免地引起图像质量的下降图像退化图像恢复就是试图利用退化过程的先验知识...

数字图像处理实验报告

数字图像处理与分析课程设计20XX~20XX学年第二学期院(系)计算机科学与通信工程专业计算机科学与技术班级计算机1201学号学生姓名指导老师**一.实验目的:熟悉数字图像处理中各种椒盐噪声的实质,明确各种滤波…

数字图像处理实验报告

数字图像处理实验报告专业计算机科学与技术学号11101115姓名王晓东实验一数字图像的读入与显示实验目的了解opencv的开发环境设置读取并显示一幅图像掌握Imreadimwriteimshow的使用掌握ope...

数字图像处理实验报告

电子科技大学中山学院电子信息学院学生实验报告注实验报告不得少于2页不得超过5页电子科技大学中山学院电子信息学院学生实验报告电子科技大学中山学院电子信息学院学生实验报告电子科技大学中山学院电子信息学院学生实验报告

数字图像处理实验报告(空间域图像增强)

实验报告实验名称课程名称空间域图像增强数字图像处理姓名成绩班级学号日期地点1实验目的1了解空间域图像增强的各种方法点处理掩模处理2通过编写程序掌握采用直方图均衡化进行图像增强的方法3使用邻域平均法编写程序实现图...

数字图像处理实验报告

数字图像处理实验报告实验一图像的几何变换一P200一图像平移一实验目的对图像进行平移二实验步骤Iimread39beautyjpg39subplot211imshowItitle39原图39a为垂直移动b为水平...

数字图像处理实验报告

数字图像处理实验报告班级通信103学号20xx27201姓名计富威指导教师孙洁实验一MATLAB数字图像处理初步一实验目的与要求1熟悉及掌握在MATLAB中能够处理哪些格式图像2熟练掌握在MATLAB中如何读取...

数字图像处理实验报告

实验报告实验名称:图像变换及频域滤波课程名称:数字图像处理1.实验目的(1)编写快速傅里叶变换算法程序,验证二维傅里叶变换的平移性和旋转不变性;(2)实现图像频域滤波,加深对频域图像增强的理解;(3)总结实验过…

数字图像处理实验报告2

实验二数字图像的空间域滤波平滑滤波1实验目的1掌握图像滤波的基本定义及目的2理解空间域滤波的基本原理及方法3掌握进行图像的空域滤波的方法2实验基本原理1空间域增强空间域滤波是在图像空间中借助模板对图像进行领域操...

《数字图像处理》综合性实验报告

数字图像处理综合性实验题目灰度图像边缘检测班级学生姓名学生学号指导老师提交时间成绩华南农业大学信息学院一实验目的1掌握各种边缘检测算子的概念及原理2掌握各种边缘检测算子的算法3掌握各种边缘检测算子VC实现的编制...

数字图像处理实验报告

数字图像处理实验报告小组序号第组组员蒋华熔1104210121刘野1104210125赵若昕1104210114高新宇1104210117查智超1104210116指导老师张玉珍20xx年5月28日实验二一实验...

数字图像处理实验报告(28篇)