医学图像处理实验指南.docx
《医学图像处理实验指南.docx》由会员分享,可在线阅读,更多相关《医学图像处理实验指南.docx(40页珍藏版)》请在冰点文库上搜索。
医学图像处理实验指南
第六节医学图像处理
一、位图文件的读取、显示以及存储
【实验目的】
1.掌握标准C及C++编程语言,熟悉VisualC++编程环境。
2.了解数字图像的表示。
3.了解位图文件的格式。
【实验内容】
1.使用VisualC++编写程序,读取标准图像lena.bmp,并将数据存入到一个二维数组中。
2.在用户视图区正确显示该图像。
3.将图像数据行首尾倒置,并保存到一个新的位图文件中。
用图像浏览器(如ACDSee、PhotoShop等)验证新写入的位图文件是否正确。
【实验原理】
偏移量
域的名称
大小
内容
图
像
文
件
头
0000.h
标识符
(Identifier)
2
bytes
两字节的内容用来识别位图的类型:
‘BM’:
Windows3.1x,95,NT
‘BA’:
OS/2BitmapArray
‘CI’:
OS/2ColorIcon
‘CP’:
OS/2ColorPointer
‘IC’:
OS/2Icon
‘PT’:
OS/2Pointer
0002h
FileSize
1dword
用字节表示的整个文件的大小
0006h
Reserved
1dword
保留,设置为0
000Ah
BitmapDataOffset
1dword
从文件开始到位图数据开始之间的数据(bitmapdata)偏移量
000Eh
BitmapHeaderSize
1dword
位图信息头(BitmapInfoHead)的长度,用来描述位图的颜色、压缩方法等,下面的长度表示:
28h-Windows3.1x,95,NT
0Ch–OS/21.x
F0h-OS/22.x
0012h
Width
1dword
位图的宽度,以像素为单位
0016h
Height
1dword
位图的高度,以像素为单位
001Ah
Planes
1word
位图的位面数
图像信息头
001Ch
BitsPerPixel
1word
每个像素的位数
1-Monochromebitmap
4–16colorbitmap
8–256colorbitmap
16–16bit(highcolor)bitmap
24–24bit(highcolor)bitmap
32–32bit(highcolor)bitmap
001Eh
Compression
1dword
压缩说明:
0–none(也使用BI_RGB表示)
1-RLE8-bit/pixel(也使用BI_RLE8表示)
2-RLE4-bit/pixel(也使用BI_RLE4表示)
3-Bitfields(也使用BI_BITFIELDS表示)
0022h
BitmapDataSize
1dword
用字节数表示的位图数据的大小。
该数必须是4的倍数
0026h
HResolution
1dword
用像素/米表示的水平分辨率
002Ah
VResolution
1dword
用像素/米表示的垂直分辨率
002Eh
Colors
1dword
位图是用的颜色数。
如8-位/像素表示为100h或者256
0032h
ImportantColors
1dword
指定重要的颜色数。
当该域的值等于颜色数时,表示所有颜色都一样重要
调色板数据
0036h
Palette
N*4byte
调色板规范。
对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:
1字节用于蓝色分量
1字节用于绿色分量
1字节用于红色分量
1字节用于填充符(设置为0)
图像数据
0436h
BitmapData
xbyte
该域的大小取决于压缩方法,他包含所有的位图数据字节,这些数据实际就是彩色调色板的索引号
表6-1位图文件格式
位图文件(Bitmap_File,BMP)格式是Windows所采用的图像文件存储格式。
一般来说,位图文件由四个部分组成:
位图文件头(bitmap_header)、位图信息头(bitmap_informationheader)、调色板以及位图数据区(字节阵列)。
【实验内容】
1.图像数据读取
(1)在Windows下打开VisualC++6.0,建立工程readbmp,并将该工程保存在自定义的目录下。
(2)在视图类的头文件readbmpView.h中定义位图文件头、信息头、调色板数据类型,并声明该类型的变量。
文件头:
structbmicolor
{WORDbftype;
DWORDbfsize;
DWORDbfreserved;
DWORDbfoffbits;
}fh;
信息头:
structinfohead
{DWORDbisize;
DWORDbiwidth;
DWORDbiheight;
WORDbiplanes;
WORDbibitcount;
DWORDbicompression;
DWORDbisizeimage;
DWORDbixpelspermeter;
DWORDbiypelspermeter;
DWORDbiclrused;
DWORDbiclrimportant;
}ih;
调色板:
structbmpcolor
{BYTEblue;
BYTEgreen;
BYTEred;
BYTEreserved;
}pallete[256];
(3)在视图类文件readbmpView.cpp中的OnDraw()函数里定义一个二维数组,用来保存图像像素的灰度值。
(4)声明一个文件类对象,CFilefp;
(5)打开图像文件,fp.Open("c:
\\ddd.bmp",0);
(6)读取图像中文件头、信息头和调色板信息。
fp.Read(&fh,sizeof(fh));
fp.Read(&ih,sizeof(ih));
for(i=0;i<256;i++)
fp.Read(&pallete[i],sizeof(pallete[i]));
(7)读取图像数据区的内容。
(8)关闭文件对象。
fp.Close();
2.图像显示
(1)定义用户视图区,CClientDC*pdc=newCClientDC(this);
(2)按照从上到下、从左到右的顺序依次显示在屏幕上显示每个像素的灰度值。
pdc->SetPixel(j+50,i+50,RGB(a,a,a));
3.图像存储
(1)将图像的行首尾倒置。
(2)以写方式来打开一个bmp文件。
(3)依次将文件头、信息头、调色板、图像数据写入该文件中。
(4)用图像浏览器验证结果。
【实验报告】
1.实验目的、实验内容、实验原理、实验内容。
2.实验源代码。
3.实验结果(在屏幕上显示的图像和行颠倒后的图像)。
【实验思考】
256色彩色图像和256灰度图像的有哪些区别?
二、数字图像的几何变换
【实验目的】
1.了解图像几何变换的类型和相应方法。
2.掌握图像比例缩放的原理和方法。
3.掌握图像旋转变换的原理和方法。
4.熟悉最近邻域插值、双线性插值的特点和方法。
【实验内容】
1.使用VisualC++编写程序,读取标准图像lena.bmp,采用双线性插值算法将其放大2.5倍,并在屏幕上显示。
2.对读出的lena图像进行任意角度的旋转,并将结果在屏幕上显示。
【实验原理】
1.图像的比例缩放
数字图像的比例缩放是指将给定的图像在x方向和y方向按相同的比例缩放a倍,从而获得一幅新的图像。
比例缩放的实质是为新图像中的每个像素分配合适的灰度值,其过程是将新图像看作是一个能够伸缩的橡皮网格,将其缩放a倍后,求其每个坐标点在原始图像中的位置。
设(x0,y0)是新图像中的一点,缩放后其在原图像中的位置为(x,y),则
通过上述坐标变换获得x和y很有可能都是非整数值,也就是点(x,y)在原图像中没有对应的像素点,因此需要通过灰度级插值的方法获取改点的灰度值。
2.图像的旋转
图像的旋转变换是几何学中研究的重要内容之一。
旋转是需要围绕一个中心点来进行的,若没有指定旋转变换的中心,一般来说,可以围绕图像的左上角或者图像的中心来进行。
数字图像中的二维矩阵是以第一个像素为原点,图像的旋转变换是将图像上的所有像素都旋转同一个角度的变换。
本实验是围绕图像左上角进行旋转的操作。
经过旋转变换后,图像中每个像素的坐标位置都会发生变化,同时图像的尺寸也会改变。
因此,对图像的旋转操作也可以分为两个步骤,即坐标的变换以及灰度级插值。
设原始图像的任意点(x0,y0)经旋转β角后新坐标为(x,y),则
最后,x和y很有可能都是非整数值,因此也需要通过灰度级插值的方法获取改点的灰度值。
若实现围绕图像中心或者任意点的旋转变换,首先要将进行平移操作,将原点位置由原来的首个像素平移到中心点位置,在按照上述的旋转公式进行坐标变换,灰度级差值,最后将旋转后图像的中心再平移回到首个像素的位置,以实现图像的正常显示与存储。
由于时间关系,绕任意点的旋转变换由学生自行完成。
3.灰度级插值
在对图像进行几何变换时,原始图像的像素坐标(x,y)为整数,而坐标变换后目标图像的位置坐标并非整数,因此该点的灰度值应由其附近的整数坐标点的灰度值来决定,这个操作称为灰度级插值处理。
常用的方法有最近邻法和双线性插值法。
(1)最近邻法。
设(x,y)为通过坐标变换得到的新坐标位置,在原图中寻找与(x,y)临近的四个整数坐标点,并将与其距离最近的整数坐标点的灰度值作为点(x,y)近似灰度值。
(2)双线性插值法。
用线性内插的方法,根据点(x,y)临近的四个整数坐标点的灰度值,通过两次插值计算出(x,y)的灰度值。
如图6-1所示。
图6-1双线性差值法
设A、B、C、D分别为与(x,y)临近的四个整数坐标点,其坐标为别为(x’,y’)、(x’+1,y’)、(x’+1,y’+1)、(x’,y’+1),灰度值分别为fA、fB、fC、fD。
首先根据A点和D点的灰度值求出E点灰度值fE,即
同理,F点的灰度值fF为
那么,根据E和F两点的灰度值便可求出点(x,y)的灰度值f,即
【实验内容】
1.图像的比例缩放
(1)读取尺寸为m×n位图文件lena.bmp;
(2)计算放大后图像的尺寸,M=2.5×m,N=2.5×n
(3)为放大后的图像分配内存空间,即
g=(unsignedchar*)malloc(sizeof(unsignedchar)*M*N);
(4)对放大后图像的每一个点(i,j)(
)进行坐标变换,变换后的坐标为别为;
(5)利用双线性插值法计算
点的灰度值,即放大后图像(i,j)处的灰度值。
(6)在屏幕上显示放大后的图像
2.图像旋转
(1)读取尺寸为m×n位图文件lena.bmp;
(2)计算放大后图像的尺寸
(3)为放大后的图像分配内存空间,即
g=(unsignedchar*)malloc(sizeof(unsignedchar)*M*N);
(4)对旋转后图像中的每一个像素点(i,j)(
)进行坐标变换,变换后的坐标为别为;
(5)利用最近邻法或双线性差值法计算
点的灰度值,即放大后图像(i,j)处的灰度值。
(6)在屏幕上显示放大后的图像。
【实验报告】
1.实验目的、实验内容、实验原理、实验内容。
2.程序源代码。
要求程序可读性好,重要的程序段或变量须加注释。
3.实验结果(缩放后的图像和旋转后的图像)。
【实验思考】
比较两种插值方法对实验结果的影响?
三、直方图均衡
【实验目的】
1.了解图像直方图的概念。
2.了解直方图均衡的目的和用途。
3.掌握直方图均衡的原理和方法。
【实验内容】
1.使用VisualC++编写程序,读取图像,并将数据存入到一个二维数组中。
2.对图像进行直方图均衡,并将处理后的图像显示在用户视图区。
【实验原理】
图像的灰度直方图是一种表示数字图像中各级灰度值及其出现频率关系的函数,通常用二维坐标来描述直方图,其横坐标表示像素的灰度级别,纵坐标表示该灰度出现的频数或概率。
灰度直方图从整体上描述了一幅图像的概貌特征,如果一幅图像的直方图覆盖了灰度级很宽的范围,而且灰度级的分布很均匀,那么这幅图像就会具有高的对比度和多变的灰度色调,因此我们可以通过修改直方图的方法来调整图像的灰度分布。
直方图均衡主要是用来增强动态范围偏小的图像的反差,从而提高图像的灰度对比度。
其主要思想是把一已知灰度概率分布的图像,经过某种变换,变成一幅具有均匀灰度概率分布的图像。
由此可以看出,直方图均衡的关键就是寻求一个灰度变换函数
,使得变换后的图像具有均匀的灰度概率分布。
若用
和
分别表示原图像和变换后图像的灰度概率密度函数,根据概率论的知识,
,其中,
为单调递增函数
如果我们将原图像的灰度概率分布函数作为变换函数,即
那么,
因此
。
可见,当取变换函数为原图像的灰度概率分布函数作为变换函数时,变换后图像的灰度概率密度是均匀的。
【实验内容】
1.利用实验一的程序代码读出待增强的原图像。
2.定义大小为256的一维数组p,用来保存每个灰度级出现的概率密度。
3.统计原图像中每个灰度级的像素数目,并保存在数组p中。
4.计算每个灰度级出现的概率密度,即用数组p中的每个元素除以图像总的像素数目。
5.计算图象各个灰度级的累计分布概率,记为
,即
6.计算变换前后灰度级的对应关系,即
7.灰度级变换,对原图像中每一个像素的灰度级用
来代替
。
【实验报告】
1.实验目的、实验内容、实验原理、实验内容。
2.实验源代码。
3.实验结果(在屏幕上显示直方图均衡后的图像)。
【实验思考】
1.为什么一般情况下对离散图像进行均衡化并不能产生完全平坦的直方图?
2.直方图均衡适用于对什么样的图像进行增强?
实验四空间域平滑和锐化
【实验目的】
1.学会模板操作方法;
2.了解平滑和锐化的意义和用途;
3.熟练掌握均值滤波和中值滤波方法;
4.熟练掌握梯度算子和拉普拉斯算子。
【实验内容】
1.使用VisualC++编写程序,读取图像,并将数据存入到一个二维数组中。
2.使用不同尺寸的模板对图像进行均值滤波,并将处理后的图像显示在用户视图区。
3.对图像进行中值滤波,并将处理后的图像显示在用户视图区。
4.使用拉普拉斯算子对图像进行锐化;
5.使用sobel算子对图像进行锐化。
【实验原理】
平滑滤波一般用于消除图像中的随机噪声,从而起到图像平滑的作用。
图像噪声在视觉上通常与它们相邻的像素明显不同,通常为孤立点,表现形式为黑区域上的白点或白区域上的黑点。
根据随机噪声的特点,在进行平滑滤波时,通常用噪声点周围临近像素点的灰度值来作为其新的灰度值。
均值滤波和中值滤波是最常用的平滑滤波方法,其中均值滤波是线性运算,而中值滤波是非线性运算。
均值滤波法是将一个像素点及其邻域中的所有像素点的平均值赋值给输出图像中相应的像素点,从而达到平滑的目的。
最简单的均值滤波法采用系数取值都为1的模板,如3×3、5×5,以及更大尺度的模板。
采用邻域平均法进行平滑滤波能够有效去除噪声,但同时也会使图像中的细节及目标边缘变模糊,而且模板尺寸越大,模糊现象越严重。
中值滤波法则在消除噪声的同时还能保持图像中的细节部分。
中值滤波是一种非线性滤波,它将邻域内(或模板覆盖下)所有像素点的灰度值从小到大排序,去中间值作为中心像素点的输出值。
图像锐化主要用于加强图像中景物的边缘和轮廓,突出图像中的细节部分。
由于边缘和轮廓处于灰度突变的地方,因此可以通过微分算子来突出或强调这些突然的变化。
图像锐化最常用的是基于仪阶微分的“梯度法”和基于二阶微分的“拉普拉斯算子“。
对于一幅图像,它的梯度是一个向量,可以表示为:
梯度向量的模值
因具有各向同性,因此可以作为锐化滤波器。
由于数字图像是离散量,无法采用微分运算,因此用差分运算来代替。
同时,由于在求取梯度模值时,需要进行平方和开放运算,运算量大,因此用绝对值来代替。
这样,梯度算子可以表示为:
除梯度算子外,还可以采用Prewitt算子和Sobel算子,其对应模板如图6-2所示。
-1
0
1
-1
0
1
-1
0
1
-1
-1
-1
0
0
0
1
1
1
-1
0
1
-2
0
2
-1
0
1
-1
0
1
-2
0
2
-1
0
1
(b)Soble算子
(a)Prewitt算子
图4.1(b)Sobel算子
图4.1(a)Prewitt算子
图6-2一阶微分算子
拉普拉斯算子是二阶微分算子,即
同样,微分操作用差分来代替,则拉普拉斯算子的离散表达式为:
拉普拉斯算子对应的模板如图6-3所示。
0
-1
0
-1
4
-1
0
-1
0
-1
-1
-1
-1
8
-1
-1
-1
-1
图6-3拉普拉斯算子所对应的模板
【实验内容】
1.均值滤波
(1)利用实验一的程序代码读出待增强的尺寸为M×N的原图像。
(2)定义3×3的二维数组p,用来保存模板系数。
(3)定义和原图像尺寸相同的二维数组newimage,用来保存均值滤波的结果。
(4)解决图像边界问题。
将原图像的首尾行和首尾列复制到结果图像中,不予处理。
(5)将模板在原图像中依次移动,并将模板中心与待处理的像素(不包括边缘像素点)重合,将模板中的各系数与其对应的像素点相乘,并将相乘结果相加求平均,则均值即为目标图像中对应模板中心位置的像素点灰度值。
(6)将目标图像在屏幕上显示。
(7)改变模板尺寸,对比不同尺寸的模板对图像的影响。
2.中值滤波
(1)利用实验一的程序代码读出待增强的尺寸为M×N的原图像。
(2)定义一个尺寸为9的一维数组p,用来保存原图像中待处理像素3×3邻域内的像素灰度值。
(3)定义和原图像尺寸相同的二维数组newimage,用来保存中值滤波的结果。
(4)解决图像边界问题。
将原图像的首尾行和首尾列复制到结果图像中,不予处理。
(5)依照从左到右、从上到下的顺序依次处理原图像中的每一个像素,将待处理像素周围3×3邻域内的像素灰度值保存到一维数组p中。
(6)使用冒泡排序法对数组p中的值按升序进行排序。
(7)将排序结果p[4]的值作为待处理像素新的灰度值,并保存在目标图像的对应位置中。
(8)将目标图像在屏幕上显示。
3.使用Sobel算子对图像进行锐化
具体实验内容参照上述均值滤波的过程。
4.使用拉普拉斯算子对图像进行锐化
具体实验内容参照上述均值滤波的过程,在得到的目标图像中,像素的灰度值有正有负,要正确显示目标图像,需要线性调整目标图像的灰度范围,将每个像素的灰度值线性调整到0~255这个范围之内。
【实验报告】
1.实验目的、实验内容、实验原理、实验内容。
2.实验源代码。
3.实验结果(在屏幕上显示滤波后的图像)。
【实验思考】
1.进行均值滤波时,模板尺寸的大小对滤波结果有什么影响?
为什么?
2.进行均值滤波时,模板的形状对滤波有什么影响?
3.对比sobel算子和拉普拉斯算子滤波后的结果,说明一阶微分和二阶微分在对图像锐化的区别。
五、频率域滤波增强
【实验目的】
1.熟悉快速傅立叶变换算法FFT;
2.了解低通滤波和高通滤波的区别;
3.熟练掌握高斯高通和高斯低通滤波器。
【实验内容】
1.使用VisualC++编写程序,读取图像,并将数据存入到一个二维数组中。
2.对图像进行傅立叶变换,并观察频谱。
3.分别用理想低通和高斯低通滤波器对图像进行滤波,反变换后观察滤波结果。
4.分别用理想高通和高斯高通滤波器对图像进行滤波,反变换后观察滤波结果。
【实验原理】
频域增强方法是将图像从空间域变换到频率域,在频域空间对图像进行滤波处理。
空间域滤波可以看作是图像
与模板
进行卷积运算,即
根据卷积定理,我们可以得到
其中,
、
、
分别是函数
、
和
的傅立叶变换。
称为滤波器传递函数,在对图像进行频率域增强时,首要的任务就是确定
,
的性质决定了对图像处理的效果。
图像从空间域变换到频率域后,其低频分量对应图像中灰度值变化比较缓慢的区域,而高频分量则对应着图像细节或物体边缘等灰度突变的成分。
如果滤波器的功能是削弱或抑制高频分量,保留低频分量,这种滤波器称为低通滤波器。
频率域中的低通滤波和空间域中的平滑滤波一样,用以消除图像中的随机噪声,消弱边缘效应,起到平滑图像的作用。
常用的低通滤波器包括理想低通滤波器、巴特沃斯低通滤波器和高斯低通滤波器。
三种低通滤波器的传递函数如下:
理想低通滤波器传递函数
n阶巴特沃斯低通滤波器传递函数
高斯低通滤波器传递函数
其中,
是一个非负数,称为截止频率,而
是频率域中从点
到频域原点的距离,即
在频率域对图像进行滤波时,如果滤波器的功能是削弱和抑制低频成分,而保留高频成分,则这种滤波器称为高通滤波器。
频域中的高通滤波可以对图像的边缘信息进行增强,起到图像锐化的作用。
高通滤波器包括理想高通滤波器、巴特沃斯高通滤波器、高斯高通滤波器等。
这三种滤波器的传递函数如下:
理想高通滤波器传递函数
n阶巴特沃斯高通滤波器传递函数
高斯高通滤波器传递函数
在频率域对图像进行滤波处理的过程如图6-4所示
图6-4频域滤波系统框图
【实验内容】
1.利用实验一的程序代码读出原图像。
要求原图像的行数和列数都为2的整数次幂(为了方便调用FFT算法)。
如果不足,自行补零。
补零后图像的尺寸为M×N。
2.定义两个大小为M×N的二维数组R和I,用来保存二维傅立叶变换的实部和虚部。
3.为了将频谱中心移中,在进行傅立叶变换之前,对原图像
进行预处理,即用
乘以
。
4.进行二维傅立叶变换,首先对每一行进行傅立叶变换,然后对中间结果的每一列进行傅立叶变换,将结果保存在二维数组R和I中。
这样就将二维傅立叶变换分解为多次一维傅立叶变换。
5.在屏幕上显示和观察图像的频谱。
6.分别采用理想低通滤波器和高斯低通滤波器对图像进行低通滤波。
此时的频谱中心位于
处,此时:
。
注意实部和虚部要做同样的修改,并将滤波后的结果仍保存在R和I中。
7.对滤波后的结果进行傅立叶反变换(也可对滤波结果取复共轭,然后进行傅立叶正变换)。
取反变换的实部,并保存在一个新的二维数组中M×N。
8.用
乘以反变换的实部,得到滤波后的图像,并在屏幕