第一篇:数字图像处理课设报告
数字图像处理课程设计报告
细胞识别
目录
第一部分
1、实验课题名称--------------------3
2、实验目的--------------------------3
第 1 页
3、实验内容概要--------------------3 第二部分
1、建立工程文件--------------------3
2、图像信息获取--------------------4
3、如何建立下拉菜单--------------6
4、标记Mark点----------------------6
5、二值化9
6、填洞---9
7、收缩---10
8、获取中心点------------------------11
9、细胞计数---------------------------13
10、All-steps---------------------------13
11、扩展功能-------------------------14 第三部分
12、各步骤结果和错误举例------16 第四部分
13、心得体会--------------------------22
第一部分
1、实验课题:细胞识别
2、实验目的:对血液细胞切片图片进行各种处理,最终得出细胞的数目、面积等信息。
3、实验内容概要:基于VC++6.0软件下的细胞识别,通过细胞的标记、二
第 2 页 值化、填洞、收缩、获取中心点、计数等过程完成实验目的。
第二部分——实验具体步骤
1、建立工程文件
① 新建MFC工程项目:--MFC AppWizard、工程名
② 拷贝cdib.h,cdib.cpp到工程文件夹,再向工程里添加
③ doc.h添加变量:m_lpDib 和头文件#include”cdib.h”
④ doc.cpp:变量(m_lpDib)的new、delete
第 3 页
⑤ doc.cpp: Serialize()
2、图像信息获取
① 读取图像参数View.cpp: OnDraw()m_pDib->Draw()如果图像不为空的话,那么就执行如下主要代码:
② 点击键,建立类向导,在messages中添加OnInitialUpdate()函数,添加代码实现对自动打开固定图片。
③ 通过鼠标右击,点击建立类向导,在messages中添加OnMouseMove()函数,添加代码实现获取所要信息,即实现鼠标在图像任一位置移动时可以直观的读取相对应位置的信息。可以在屏幕上显示鼠标所指点的坐标以及RGB、HSI和灰度值,通过HSI的可以选取合适的阈值来找到细胞以及边界。
第 4 页 ④ 为了RGB图像转化为人眼更容易识别的HSI模型,我们可以通过添加成员函数RgbtoHsi来实现这一功能。
HSI模型与RGB模型的转化关系
(添加函数时,可以右击类窗口中的view.h,选中add member function,之后选择函数的返回值类型和函数描述,其它默认不变)
确定后在里面添加实现函数功能的代码。
3、添加下拉菜单
在resourceview那栏的找到菜单按键设置
第 5 页 双击,后在里面添加所需按键
每个按键的ID号为注意在填写为IDR_加菜单大写。
之后右击按键,建立类向导添加按键所需函数
4、标记mark 分为四步
1.找出mark(red)点和maybemark(blue)点
2.将maybemark(blue)点变成mark(black red)点
3.将mark(black red)点变成edge(yellow(fullred&&fullgreen))点 4.edge点滤波
基本思想:Mark点指的是我们要寻找的细胞内的点。我们先获取每一个像素点的RGB分量,然后我们将其转化成HSI分量,将H分量进行归一化,因为S的范围是0到1,所以我们要进行尺度的一致,这样才具有可计算性。然后我们通过每个像素点的H分量和S分量的值与细胞内部的H分量和S分量计算欧几里得距离,设定一个Mark门限值(我们这里将MarkDoor设置为0.09,大家可以行设置合适的参数),小于这个门限值我们就当做是细胞的内部,然后对细胞进行标记(Red)。还需要设定一个Maybe Mark门限值(我们这里将Maybe MarkDoor设置为0.15,大家可以行设置合适的参数),我们大于Mark门限值小于Maybe Mark门限值时,我们暂时看成是细胞,我们进行Maybe Mark的标记(Blue)。否则的话,我们需要考虑,一些不是Mark和Maybe Mark点的*lpSrc==0我们区别一下赋值为1,*lpSrc==255
第 6 页 我们区别一下赋值为254,*(lpSrc+1)==255我们区别一下赋值为254.这样的话,我们在后面判断是否为Mark点的时候,我们只需要判断*lpSrc是否为0就可以了,判断Maybe Mark点时只需要判断*(lpSrc)是否为255就可以了。对于边缘的判断只需要判断*(lpSrc+1)是否为255就可以了。
将细胞标记为Mark用红色(255,0,0)标记出来,将可能是的细胞标记为MayBe Mark用蓝色(0,0,255)标记出来。将MayBeMark To Mark的区域用亮红(128,0,0)表示,将不可能是细胞的区域、细胞边界分别用绿色标记出来。操作过程:(1)根据H、S的欧几里得距离sqrt(s2+h2)来大致的确定哪些是细胞(Mark)和可能是细胞(Maybe Mark)的点。
(2)根据Maybe Mark点周围的情况,如果它的上下左右四个方向有Mark点,则将Maybe Mark点变成Mark点。
(3)用Sobel算子来做边缘的提取边界(0,255,255)(255,255,0),使用3*3的模板,使用欧几里得距离来判断是否为边缘。
两种Sobel算子如下:
第 7 页
主要代码如下:
doubletmp1=pixel[0]+2*pixel[1]+pixel[2]-pixel[6]-2*pixel[7]-pixel[8];doubletmp2=pixel[0]+2*pixel[3]+pixel[6]-pixel[2]-2*pixel[5]-pixel[8];double edge=sqrt(tmp1*tmp1+tmp2*tmp2);
if(edge>edgeDoor)*(lpDst+1)=255;//Sobel判断该点是否edge//edgeDoor=40(4)edge滤波
就是去除全边缘点(四周都是背景或边缘)(强度为5)
5、二值化
基本思想:将原有彩色图像变换为二值图像,其中细胞0X80(128)用Gray(灰色)标记出来,边缘0xF0(240)用Bright(亮色)标记出来,其他表示为0。主要代码:
第 8 页
6、填洞
将细胞中或者细胞相邻的地方的较小的背景填成细胞的背景,填完的细胞背景的灰度值是129,因为都被访问过了,然后将边缘去掉。
填洞的基本思想:首先将细胞或边缘内的黑点置为vistied = 0x01,以该黑点为中心,在其上下左右侧进行访问是否有未访问的黑点,若有则将上方黑点压栈,且上下左右侧的黑点置已访问。将堆栈顶端的数据弹出,作为新的种子进行扩散,即以该元素为基点,判断其周围是否存在未访问黑点,若有则继续压栈,重复操作。直到找到最后一点,此点四周均不存在未访问黑点,结束访问。若洞像素数小于100大于50,洞内像素数及其初进栈的点(56,(409,222))时,则进行填洞。填洞的过程就是将非mark点转化为mark点。
主要标记访问代码:
填洞函数主要代码分析:
填完洞后,进行下面操作:
如果图像中只有已访问黑点0x01则将其恢复成0;如果图像中只有Edge点0xf0则将 Edge置为黑点。这样图像中只有黑色的背景以及灰色的细胞mark(0x80)点。
主要代码:
第 9 页
7、收缩
收缩的目的是为了方便计数。通过扫描图像,对图像进行预先的3次腐蚀,判断所生成边界点,然后根据原理判定是否标注该点,存放所标志的中心点,便于统计细胞个数及计算细胞半径。
由Mark生成边界,我们有四邻域生成边界和八邻域生成边界。判断该点是否为Mark点,如果是Mark点的话,我们判断i、j是否是我们选取图片的边界,如果是的话,我们将该点变成边缘点,否则我们判断它的上下左右(周围八个点)是否有非Mark点,如有有,则将这边变成边缘点,反之,不变。
8邻域收缩操作代码(4邻域与8邻域思想相同):
第 10 页
8、获取中心点
根据前面所作工作统计获得的中心点个数,去掉一系列不符合要求的点得出最终的细胞个数、细胞的平均半径和平均面积,用对话框输出统计结果。
操作过程如下:
① 首先我们要去除访问标志,是我们先前一次在判断是否需要保存点的时候(MarkIt(int i, int j)),我们将边缘点都标记成访问过了,这时在处理下一次遍历图片发现中心点的时候,我们要进行判断点是否要保存就没有办法做了,所以在没进行一次图片的遍历之前我们都需要去除访问标志。主要代码:*lpSrc&=NO_VISITED;//0xfe// 清除visited标志
最后位 置0操作
② 需要判断是否是边界以外的点,这里我们只处理边界内部的点,对于边界外部的点不加以查找中心点。对于内部的点,我们先要判断是否是孤立的边缘点,即判断该边缘点的上下左右四个点都不是Mark点和边缘点我们认为是孤立的边缘点,但是我们在这里也要去除半径不大于2的孤立点,因为我们认为它的半径太小,是噪声。如果是半径大于2的孤立点,我们对他进行标记成中心点,对半径做一点补偿(pt.radius=k+pre_shrink_count+4,4为补偿)。然后在入队。
主要代码如下:
{
第 11 页 if(k<3)// 如果进行第一次收缩即消失的点则认为该点是噪点,不进行保存直接进行下一次收缩
continue;
// 孤立的点
*lpSrc |=CENTERED;//0x2 对孤立点加上中心点标志0xf2//后面shrink时为0x02
// 保存一下CENTER_POINT信息(圆心,半径)
pt.x=i;pt.y=j;pt.radius=k + pre_shrink_count + 4;// +4放大补偿,k为把此圆收缩到一点所经历的收缩次数
points_temp.push_back(pt);continue;}
③ 需要判断是否需要保存该点,我们在判断它的上下左右是否有没有访问过的边缘点,这里我们运用递归函数来找相连通的边缘点,如果是全边缘点的时候我们就需要保存,即将m_bFullEdge=1。在保存的函数中我们将该点变成中心点,然后半径补偿然后我们来对该点入队(保存),然后将该点设置成没有访问过的点,因为下面在做该点的上下左右是否为访问过的,访问过才保存,因为这个点已经保存过了,所以要将保存过的点设置成没有访问过,我们必须将这点变成没有访问过。然后判断该点的周围八点是否是访问过的,如果访问过就保存该点,这里也是运用递归函数来实现的。
对中心点处理:
a)独立的中心点直接存储
b)相邻的中心点通过递归求质心作为圆心,最大半径作为新的半径,合并各中心为一点
主要代码如下:
pt.x=tot_x/tot_num;//质心 pt.y=tot_y/tot_num;pt.radius=max_radius;//取最大半径作为质点中心点半径 *(lpSrc-(pt.y-j)*lLineBytes+pt.x-i)|=CENTERED;//质点置为中心点 points.push_back(pt);c)相近但不相邻的点,求质心为圆心,最大半径为半径(直到无相近点)
主要代码如下:
if(abs(x0-x)+abs(y0-y)<10)// 相近
{
/*pt=points.at(j);if(points.at(i).radius
pt=points.at(i);*/ points.at(i).x=(x+x0)/2;//取均值,保存最大半径
第 12 页
points.at(i).y=(y+y0)/2;points.at(i).radius=max(points.at(i).radius,points.at(j).radius)+4;pt=pt=points.at(i);d)在无相近点的情况下,若半径小于8,则删除。
主要代码如下:
if(bdelete)
{
} e)两圆相交,若其中一圆非相交部分面积小于50%,则删除
主要代码如下:
if(total
9、细胞计数
打开我们处理前的图片,根据前面保存中心点的队列,我们知道中心点的位置和细胞的半径,然后我们重新的导入细胞的图片,在上面画圆,标出细胞。然后我们获取细胞内部的HSI的最大值和最小值,计算出细胞的平均面积和个数。主要代码如下:
msg.Format(“共有%d个细胞,平均半径%d,平均面积%d : H(%3.1f,%3.1f)S(%3.2f,%3.2f)I(%3.2f,%3.2f)”, m_vCenterPoints.size(),(int)(totr/m_vCenterPoints.size()+.5),(int)(tota/m_vCenterPoints.size()+.5), 360.0*min[0]/255.0,360.0*max[0]/255.0, 1.0*min[1]/255.0,1.0*max[1]/255.0, 1.0*min[2]/255.0,1.0*max[2]/255.0);
10、All-steps
第 13 页 可以一次性实现细胞识别的所有操作步骤
设置控制按键的权限,点击update_command_ui ,键入控制条件
每步操作时给cellprocess设置不同数值,表示那步进行过,只能进行规定的下步操作,从而在运行过程中放置按键误触导致程序崩溃。
11、扩展:
区域选择:
第 14 页
建立类向导:OnButtonDown 和OnButtonUp 键入代码:
在OnDraw中添加下列代码
注意:bool 变量m_bDrag要定义在view.cpp文件头部,定义在view.h会出现第一次区域选择时出现错误。
添加复位按键:
第 15 页
点击该键后会重新读取图像(和图像自动打开代码一样)
第三部分
12、各步骤结果和错误举例
① 各步骤结果图
a.Mark(Red)& MayBe Mark(Blue)
maybemark to mark(black red)第 16 页
edge information and edge filter
twovalue
fillholes 第 17 页
shrink
findcenter 第 18 页
count
出现的错误举例:
Mousemove 程序中出现问题: 1.错误:
没有加#include “MainFrm.h”头文件 2.错误
第 19 页
error C2248: 'm_wndStatusBar' : cannot access protected member declared in class 'CMainFrame'
需将protected: // control bar embedded members CStatusBar m_wndStatusBar;CToolBar
m_wndToolBar;
protected变为public 供用户操作使用
MouseMove函数中((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(0,str);使str.Format中内容显示在标准窗口图像的左下方bar
3.MouseMove的坐标判决放在for循环外,鼠标移动到图像外,程序会崩溃。解决:改变坐标判决代码的位置
通见问题:
在ClassView中的类视图不见了,在FileView视图中该类的.h和.cpp文件仍然存在
解决方案:先保存workspace,然后关闭工程,删除此工程目录中的.ncb文件,重新打开workspace 原因:classview显示混乱 在类中添加的成员变量和成员函数不能显示出来,即使显示出来了变量或函数,双击后不能跳至正确的位置。
第 20 页
Edge information中出现问题
正常
不正常
memcpy(lpNewDIBBits,lpSrc,lHeight *lLineBytes);代码应放在图像处理前,参考图像是初始状态的图像,把第一步的四个小步骤分开写在不同的函数内时,因为每一小步的操作都会改变图像的状态,如果把: memcpy(lpNewDIBBits,lpSrc,lHeight *lLineBytes);写在maybemark_to_mark之后那么参考图像就不是原始图像
发现:做到shrink时,看到收缩后的图像效果很差,和标准收缩图像相差较大,经调试后发现问题(没注意 ppt最后一页有,老师在qq群在中也提到过)。
Shrink操作后,关闭图像,出现问题 GenEdge4()函数中出现问题 for(int j=0;j { lpSrc =(unsigned char *)pDoc->m_lpDib->m_lpImage + lLineBytes*(lHeight-1-j)-1; for(int i=0;i { lpSrc++;......和 for(int j=0;j for(int i=0;i { 第 21 页 lpSrc =(unsigned char *)pDoc->m_lpDib->m_lpImage + lLineBytes*(lHeight-1-j)-i;....for循环问题 有差异 后面起始点地址为dot1 前面起始点地址为 dot1+1,不处理四周边界 可以把第二个for循环语句中前面的i=0 改成i=1.观察图像,发现Shirnk后未保存填洞点,结果只有 0x00 0x80 0xf0 // *lpSrc &=NO_EDGE_POINT;//至关重要 少写后,程序一直崩溃。 这段代码在GenEdge函数中,在shrink步骤中没影响,但在找中心点过程中用到这个函数时,这段代码就十分必要。否则程序会在运行findcenter时直接崩溃。 中心点标志 0x02 不是0xf2 Temp.at(n).y 等同于 temp[n].y 13、心得体会 通过对本次数字图像处理课程设计的学习,进一步加深了对数图知识的理解,同时也基本掌握了VC++软件的使用方法。从一开始的连图像都无法打开,到最后在老师上课的资料以及同学的帮助和学长的参考程序下终于完成了一幅细胞图像的整个识别过程。自己一向在编程方面有所欠缺,通过咨询老师和同学还有百度,自己也慢慢理解了所写程序代码的含义,间接地提高了自己写代码与识别代码的能力。 通过一个星期多的学习,我对细胞识别的基本思想有了深一步的理解,也让我对c语言相关的知识得到了回顾。此次课程设计给我们提供了一个既能学习又能锻炼的机会,使我们养成了查找资料(主要是在百度上查阅一些代码的含义)的习惯,将理论与实际相结合起来,锻炼了分析问题和实际解决问题的能力。提高了适应能力,为今后的学习和实践打下了基础。 第 22 页 实验五 图像的几何变换 一.实验目的及要求 掌握图像几何变换的基本原理,熟练掌握数字图像的缩放、旋转、平移、镜像和转置的基本原理及其MATLAB编程实现方法。 二、实验内容 (一)研究以下程序,分析程序功能;输入执行各命令行,认真观察命令执行的结果。熟悉程序中所使用函数的调用方法,改变有关参数,观察试验结果。 1.图像缩放 clear all, close all I = imread('cameraman.tif');Scale = 1.35; % 将图像放大1.35倍 J1 = imresize(I, Scale, 'nearest'); % using the nearest neighbor interpolation J2 = imresize(I, Scale, 'bilinear'); % using the bilinear interpolation imshow(I), title('Original Image');figure, imshow(J1), title('Resized Image--using the nearest neighbor interpolation ');figure, imshow(J2), title('Resized Image--using the bilinear interpolation ');help imresize % 查看imresize使用帮助 1.95倍 I = imread('cameraman.tif');Scale = 1.96; % 将图像放大1.96倍 J1 = imresize(I, Scale, 'nearest'); % using the nearest neighbor interpolation J2 = imresize(I, Scale, 'bilinear'); % using the bilinear interpolation imshow(I), title('Original Image');figure, imshow(J1), title('Resized Image--using the nearest neighbor interpolation ');figure, imshow(J2), title('Resized Image--using the bilinear interpolation '); 说明: 注意观察不同插值方法的图像表现; 改变图像缩放因子Scale,重做上述实验。2.图像旋转 clear all, close all I = imread('cameraman.tif');Theta = 45; % 将图像逆时针旋转45。 J1 = imrotate(I, Theta, 'nearest'); % using the nearest neighbor interpolation Theta =-45; % 将图像顺时针旋转45。 J2 = imrotate(I, Theta, 'bilinear', 'crop');% using bilinear interpolation and crops the output image imshow(I), title('Original Image');figure, imshow(J1), title('Rotated Image--using the nearest neighbor interpolation ');figure, imshow(J2), title(' Rotated Image--using the bilinear interpolation ');% 查看imrotate使用帮助 help imrotate %------- 图像旋转30顺时针逆时针 clear all, close all I = imread('cameraman.tif');Theta = 30; % 将图像逆时针旋转30。 J1 = imrotate(I, Theta, 'nearest'); % using the nearest neighbor interpolation Theta =-30; % 将图像顺时针旋转30。 J2 = imrotate(I, Theta, 'bilinear', 'crop');% using bilinear interpolation and crops the output image imshow(I), title('Original Image');figure, imshow(J1), title('Rotated Image--using the nearest neighbor interpolation ');figure, imshow(J2), title(' Rotated Image--using the bilinear interpolation ');7 说明: 注意观察不同插值方法和输出图像后处理方法的图像表现; 改变旋转角度大小和方向,重做上述实验。 3.图像水平镜象 clear all, close all I = imread('cameraman.tif');I1 = flipdim(I,2); I2 = flipdim(I,1);figure(1), subplot(1,2,1), imshow(I);subplot(1,2,2), imshow(I1);figure(2), subplot(2,1,1), imshow(I);subplot(2,1,2), imshow(I2);%---- (二)用MATLAB编程实现以下图像几何变换(参考自编讲义相关章节) 1.图像扭曲变换 2.球面变换 三、实验设备 1.PIII以上微机; 2.MATLAB6.5; 四、预习与思考 1.预习实验内容,阅读教材熟悉实验原理; 2.查阅资料,熟悉实验中涉及的有关MATLAB函数; 3.利用课余时间,采用MATLAB底层函数编程实现实验内容 (二)中的图像平移、图像转置等几何变换。 五、实验报告要求 1.简述试验的目的和试验原理; 2.叙述各段程序功能,改变有关函数的参数,分析比较实验结果; 3.打印出所编写的实验程序。4.写出本实验的心得体会及意见。 实验六 数字图像处理应用 一.实验目的及要求 1.利用MATLAB提供的图像处理函数实现图像中物体属性的测量; 2.训练综合运用MATLAB图像处理函数的能力; 3.了解数字图像处理基本应用。 二、实验内容 以大米粒特性测量为例,综合应用课程中图像分割、形态学滤波、图像增强、图像特征提取等图像处理方法,实现大米粒特性自动测量。实验过程简述: 1. 读取和显示图像 2. 估计图像背景 3. 获取背景均匀的图像 4. 图像增强 5. 图像二值化分割 6. 区域标记及为彩色处理 7. 测量图像中的区域特性(面积、质心等) 8.统计大米粒的特性分布规律。 (一)研究以下程序,分析程序功能;输入执行各命令行,认真观察命令执行的结 果。熟悉程序中所使用函数的调用方法,改变有关参数,观察试验结果。 % Read and Display an Image clear, close all,close all;I = imread('rice.png'); figure, imshow(I) % Use Morphological Opening to Estimate the Background background = imopen(I,strel('disk',15)); figure, imshow(background); %Display the Background Approximation as a Surface figure, surf(double(background(1:8:end,1:8:end))),zlim([0 255]);set(gca,'ydir','reverse');% Subtract the Background Image from the Original Image I2 = imsubtract(I,background);figure, imshow(I2)% Adjust the Image Contrast I3 = imadjust(I2, stretchlim(I2), [0 1]);figure, imshow(I3);% Apply Thresholding to the Image level = graythresh(I3);bw = im2bw(I3,level);figure, imshow(bw)% Determine the Number of Objects in the Image [labeled,numObjects] = bwlabel(bw,4); % Label components.numObjects % Examine the Label Matrix RGB_label = label2rgb(labeled, @spring, 'c', 'shuffle');figure, imshow(RGB_label);% Measure Object Properties in the Image graindata = regionprops(labeled,'basic')allgrains = [graindata.Area];% Compute Statistical Properties of Objects in the Image max(allgrains);biggrain = find(allgrains==695)mean(allgrains);figure, hist(allgrains,20);12 (详见MATLAB IPT的 帮助文档demo中的Correcting Nonuniform Illumination) (二)查看MATLAB IPT 帮助文档,研究其它应用演示 三、实验设备 1.PIII以上微机; 2.MATLAB6.5; 四、预习与思考 1.预习实验内容,阅读教材熟悉实验原理; 2.查阅资料,熟悉实验中涉及的有关函数。 3.利用课余时间,采用MATLAB函数编程实现实验内容 (二)。 五、实验报告要求 1.简述试验的目的和试验原理; 2.叙述各段程序功能,改变有关函数的参数,分析比较实验结果; 3.打印出所编写的实验程序。4.写出本实验的心得体会及意见。 中南大学 数字图像处理实验 实验名称:空间滤波和频域滤波 班级:电子信息0802班 姓名:李哲 学号:0909080609 实验日期:2010年12月22日 目录 一,实验目的„„„„„„„„„„„„„„„„„„„„„„„3 二,给图像添加噪声„„„„„„„„„„„„„„„„„„„„4 三,对被噪声污染的图像进行中值滤波和均值滤波„„„„„„„5 四,对图像进行空间域的锐化„„„„„„„„„„„„„„„„6 五,MATLAB以外函数空间滤波和图像锐化„„„„„„„„„„7 六,自带函数傅立叶变换和反变换„„„„„„„„„„„„„„8 七,低通滤波器程序„„„„„„„„„„„„„„„„„„„„9 八,心得体会 „„„„„„„„„„„„„„„„„„„„„„10 九,参考文献 „„„„„„„„„„„„„„„„„„„„„„10 一、实验目的 1,空间滤波: 图像平滑主要目的是减少噪声。噪声有很多种类,不同的噪声有不同的抑制措施。本实验要求用平滑线性滤波和中值滤波2种最典型、最常用的处理算法进行程序设计,学习如何对已被噪声污染的图像进行“净化”。通过平滑处理,对结果图像加以比较,得出自己的实验结论。学习如何用锐化处理技术来加强图像的目标边界和图像细节,对图像进行梯度算子、拉普拉斯算子,使图像的某些特征(如边缘、轮廓等)得以进一步的增强及突出。本实验锐化处理主要在空间域中进行 2,频域滤波: 掌握傅里叶变换的基本性质; 掌握傅里叶正变换和反变换; 通过实验了解二维频谱的分布特点; 掌握怎样利用傅立叶变换进行频域滤波 利用MATLAB程序数字图像的傅立叶变换并且进行频域滤波 二,给图像添加椒盐噪声或者高斯噪声: 原理:利用MATLAB自带函数添加噪声 程序代码:A=imread('onion.png');I=rgb2gray(A);imshow(I);J = imnoise(I,'salt & pepper',0.05);figure,imshow(J),title('椒盐噪声');%添加椒盐噪声 K = imnoise(I,'gaussian',0,0.03); figure,imshow(K),title('高斯噪声');%添加高斯噪声 三,对被噪声污染的图像进行中值滤波和均值滤波: 原理:自带函数进行中值滤波和均值滤波 源程序:A=imread('onion.png');I=rgb2gray(A);J = imnoise(I,'salt & pepper',0.05);k2=medfilt2(J,[5 5]);k3=medfilt2(J,[7 7]);imshow(J),title('原图');figure,imshow(k2),title('中值滤波5*5模板');figure,imshow(k3),title('中值滤波7*7模板'); 四,对图像进行空间域的锐化: 原理:自带函数进行空间锐化。源程序:I=imread('coins.png');subplot(121),imshow(I),title('原图像');H=fspecial('sobel');I2=filter2(H ,I);subplot(122),imshow(I2),title('sobel算子锐化图像'); 五,MATLAB以外函数空间滤波和图像锐化: 源程序:I = imread('eight.tif');J = imnoise(I,'salt & pepper',0.02);K = medfilt2(J);imshow(J);title('噪声干扰图像')figure, imshow(K);title('medfilt2滤波图像')X=J;a=2;b=2;k=floor(a*b/2)+1;[M,N]=size(X);uint8 Y=zeros(M,N);funBox=zeros(a,b);temp=zeros(a*b); for i=1:M-a for j=1:N-b funBox=X(i:i+a,j:j+b); temp=funBox(:); tempSort=sort(temp); Y(i,j)=tempSort(k); end;end;figure, imshow(Y);title('滤波图像') 六,利用Matlab的图像处理工具箱中提供的函数实现图像的傅立叶变换和反变换: 源程序: A=imread('onion.png');f=rgb2gray(A);subplot(131),imshow(f),title('原图');F=fft2(f);% 快速傅立叶变换 subplot(132),imshow(F),title('傅里叶变换')Fabs=abs(F);% 求幅频绝对值 Fc=fftshift(Fabs);% 中心移位 SFc=log(1+Fc);% 对数变换 iFc1=ifftshift(Fc);% 中心移位的逆变换,绝对值 iF2=ifft2(iFc1);% 快速傅立叶变换的逆变换 subplot(133),imshow(iF2),title('快速傅立叶变换的逆变换') 七,低通滤波器程序: I=imread('testpat1.png');subplot(221),imshow(I);title('原始图像')J1=imnoise(I,'gaussian',0.02);% 叠加高斯白噪声 subplot(222),imshow(J1);title('添加高斯白噪声的图像')f=double(J1); % 数据类型转换 g=fft2(f); % 傅立叶变换 g=fftshift(g); [M,N]=size(g);nn=2; % 二阶巴特沃斯(Butterworth)低通滤波器 d0=50; % 设置截止频率 m=fix(M/2);n=fix(N/2);for i=1:M for j=1:N d=sqrt((i-m)^2+(j-n)^2); h=1/(1+0.414*(d/d0)^(2*nn));% 计算低通滤波器传递函数 result(i,j)=h*g(i,j);end end result=ifftshift(result);J2=ifft2(result);J3=uint8(real(J2));subplot(223),imshow(J3);title('低通滤波后图像') 心得体会 1,进一步熟悉了Matlab软件、编程以及图像处理工具箱 2,学会利用自带函数对图像做简单的处理,例如:均值化等。3,熟练了一些基本函数的运用,例如fspecial,imfilter等。4,加深了对MATLAB编程的理解。 5,对于试验中的出现的一些问题,懂得怎样去处理。6,通过实际操作,增强了自己的动手能力,把理论用于实践。 参考文献:数字图像处理第二版 MATLAB教程 练习一 常用MATLAB图像处理命令 一、练习目的 1、熟悉并掌握MATLAB工具的使用; 2、实现图像的读取、显示、代数运算和简单变换。 二、练习环境 Windows操作系统 Matlab 6.5或以上应用软件 三、练习内容 1、图像文件的读写 (1)imread函数用来实现图像文件的读取。输入以下程序: A=imread('文件名.扩展名');%用imread函数来读入图像 注:设置路径 imshow(A);%用imshow函数来显示图像 得到的结果如图: (2)imfinfo函数用来查询图像文件信息。输入以下程序: info=imfinfo('文件名.扩展名');% 用imfinfo函数查询图像文件信息 得到: info = Filename: '文件名.扩展名' (4)imshow函数用来显示图像。 刚才介绍imread函数时已使用此函数。 (5)colorbar函数将颜色条添加到坐标轴对象中。输入以下程序: RGB=imread('***');%图像读入 I=rgb2gray(RGB);%把RGB图像转换成灰度图像 imshow(I),colorbar('vert')% 将颜色条添加到坐标轴对象中 得到如图: 2、图像处理的基本操作 一、图像代数运算 (1)imadd函数实现两幅图像的相加或者给一幅图像加上一个常数。给图像每个像素都增加亮度的程序如下: I=imread('***');J=imadd(I,100);%给图像增加亮度 subplot(1,2,1),imshow(I)%填充 subplot(1,2,2),imshow(J)结果如图5。 (2)imsubtract函数实现从一幅图像中减去一个常数。输入以下程序实现从一幅图像中减去一个常数: (3)immultiply实现两幅图像的相乘或者一幅图像的亮度缩放(图像乘以小于1或大于1的参数,比较效果)。输入以下程序: (4)imdivide函数实现两幅图像的除法或一幅图像的亮度缩放。输入以下程序: 二、图像的空间域操作 (1)imrotate函数实现图像的旋转。输入以下程序: I=imread('***');J=imrotate(I,45);%对图像进行旋转 subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);得到图: 练习二 数字图像处理的基本操作 一、练习目的 1、练习使用MATLAB工具进行数字图像处理; 2、实现图像的边缘提取、滤波、直方图修正等操作。 二、练习环境 Windows操作系统 Matlab 6.5或以上应用软件 三、练习内容 (1)imresize函数实现图像的缩放。输入以下程序: J=imread('文件名.扩展名');X1=imresize(J,2);%对图像进行缩放 figure,imshow(J)结果如图 (2)imcrop函数实现图像的剪切。输入以下程序: I=imread('***');I2=imcrop(I);%对图像进行剪切 subplot(填充),imshow(填充);subplot(填充),imshow(填充);如图: 图像变换 (1)fft2函数和ifft2函数分别是计算二维的FFT和反变换。输入以下程序: f=zeros(100,100);f(20:70,40:60)=1;imshow(f);F=fft2(f);% 计算二维的FFT F2=log(abs(F));%对幅值取对数 imshow(F2),colorbar (2)dct2函数采用基于FFT的算法,用于实现较大输入矩阵的离散余弦变换。与之对应,idct2函数实现图像的二维逆离散余弦变换 输入以下程序: RGB=imread('***');I=rgb2gray(RGB);J=dct2(I);% 对I进行离散余弦变换 imshow(log(abs(J))),colorbar J(abs(J)<10)=0;K=idct2(J);% 图像的二维逆离散余弦变换 figure,imshow(I);figure,imshow(K,[0,255])得到如图: (3)edge函数用于提取图像的边缘。输入以下程序: RGB=imread('drum.bmp');I=rgb2gray(RGB);BW=edge(I);% 提取图像的边缘 imshow(I),figure,imshow(BW);得到图 图像增强、分割和编码 (1)imhist函数产生图像的直方图。A=imread('drum.bmp');%读入图像 B=rgb2gray(A);%把RGB图像转化成灰度图像 imshow(B);%显示灰度图像 imhist(B)%显示灰度图像的直方图 得到图 (2)histeq函数用于对图像的直方图均衡化。接上面程序: C=histeq(B);%对图像B进行均衡化 imshow(C);%显示图像 imhist(C);%得到均衡化后的灰度直方图 得到如图 filter2函数实现均值滤波。输入以下程序: a=imread('noise.drum.jpg');I=rgb2gray(a);imshow(I);K1=filter2(fspecial('average',3),I)/255;% 33的均值滤波 K2=补充; % 55的均值滤波 K3=补充; % 77的均值滤波 figure,imshow(K1);figure,imshow(K2);figure,imshow(K3);得到图 (5)medfilt2函数实现中值滤波。输入以下程序: 自查函数如何使用,并编程: 结果如图: 练习三 图像采样及图像类型转换 一、练习目的 1、熟悉并掌握MATLAB图像处理工具箱的使用; 2、试对自选图像分别进行4和16倍剪采样,查看其剪采样效果 3、将所给图,转换成256级灰度图像,8级灰度图像和2值图像 二、练习环境 MATLAB 6.5或以上版本、WIN XP或以上计算机 三、练习内容 使用MATLAB,对图像进行减采样。 a = imread('***.JPG');b = rgb2gray(a);[wid,hei]=size(b);%4倍减抽样 quartimg = zeros(wid/2+1,hei/2+1);i1 = 1;j1 = 1;for i=1:2:wid for j=1:2:hei quartimg(i1,j1)= b(i,j); j1 = j1 + 1; end i1 = i1 + 1;j1 = 1;end figure imshow(uint8(quartimg))练习结果如图 %16倍减抽样 编程并运行显示图像结果: 图像类型 1、练习内容 试将自选图,转换成256级灰度图像,8级灰度图像和2值图像 2、练习方法及程序 使用MATLAB,进行图像类型变换。 a = imread('***.jpg');b = rgb2gray(a); figure imshow(b)[wid,hei]=size(b);img8 = zeros(wid,hei);img2 = zeros(wid,hei);for i=1:wid for j=1:hei img8(i,j)= floor(b(i,j)/32);%得到8级灰度图像 end end figure imshow(uint8(img8),[0,7])for i=1:wid for j=1:hei 补充;end end figure imshow(uint8(img8),[0,2])%得到2值图像 练习结果如图 练习四 数字图像的空间域处理 一、练习目的 1、熟悉并掌握MATLAB图像处理工具箱的使用; 2、熟悉图像相加的方法及效果 3、熟悉图像灰度扩展的方法及效果 4、熟悉图像缩放、旋转的方法及效果 二、练习环境 MATLAB 6.5或以上版本、WIN XP或以上计算机 三、练习内容 Part 1(1)选择一幅图像***.jpg,设置输入输出变换的灰度级范围,a=0.3, b=0.6, c=0.1, d=0.9; (2)设置非线性扩展函数的参数c=2; (3)采用灰度倒置变换函数s=255-r进行图像变换; (4)设置二值化图像的阈值,分别为level=0.4,level=0.7参考程序如下: I=imread('***.jpg');figure;subplot(1,3,1);imshow(I);title('原图');J=imadjust(I,[0.3;0.6],[0.1;0.9]);%设置灰度变换的范围 subplot(1,3,2);imshow(J);title('线性扩展');I1=double(I);%将图像转换为double类型 I2=I1/255;%归一化此图像 C=2;K=C*log(1+I2);%求图像的对数变换 subplot(1,3,3);imshow(K);title('非线性扩展');M=255-I;%将此图像取反 figure;subplot(1,3,1);imshow(M);title('灰度倒置');N1=im2bw(I,0.4);%将此图像二值化,阈值为0.4 N2=im2bw(I,0.7);%将此图像二值化,阈值为0.7 subplot(1,3,2);imshow(N1);title('二值化阈值0.4');subplot(1,3,3);imshow(N2);title('二值化阈值0.7');练习结果与分析 (1)练习结果如图3.7所示。 Part 2 读取一幅图片,如***.jpg,设置图像旋转的角度分别为450和900,采用图形旋转函数imrotate对图像进行旋转。程序如下,结果如图3.10。 I=imread('i_lena.jpg');J=imrotate(I,45);%图像进行逆时针旋转,默认采用最近邻法进行插值处理 K=imrotate(I,90);%默认旋转出界的部分不被截出 subplot(1,3,1);imshow(I);subplot(1,3,2);imshow(J);subplot(1,3,3);imshow(K);练习结果与分析 (1)练习结果如图3.10所示。 练习五 数字图像的频域处理 一、练习目的 1、熟悉并掌握MATLAB工具的使用; 2、实现图像离散傅里叶变换并观察效果 3、实现图像离散余弦变换并观察效果 二、练习环境 Windows操作系统 Matlab 6.5或以上应用软件 三、练习内容 Part 1 选取一幅图像,进行离散傅里叶变换,再对其分别进行X轴与Y轴上的平移,得其离散傅里叶变换,观察三幅结果图。 I=imread('1.bmp');figure(1)imshow(real(I));I=I(:,:,3);fftI=fft2(I);sfftI=fftshift(fftI);%求离散傅里叶频谱 %对原始图像进行二维傅里叶变换,并将其坐标原点移到频谱图中央位置 RRfdp1=real(sfftI);IIfdp1=imag(sfftI);a=sqrt(RRfdp1.^2+IIfdp1.^2);a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225; figure(2)imshow(real(a));练习结果与分析 Part 2 选取一幅图像,进行离散傅里叶变换,再对其进行一定角度的旋转,进行离散傅里叶变换。 %构造原始图像 I = zeros(256,256); I(88:168,124:132)= 1;%图像范围是256*256,前一值是纵向比,后一值是横向比 imshow(I) %求原始图像的傅里叶频谱 J = fft2(I);F = abs(J);J1 = fftshift(F);figure imshow(J1,[5 50]) %对原始图像进行旋转 J = imrotate(I,90,'bilinear','crop');figure imshow(J)%求旋转后图像的傅里叶频谱 J1 = fft2(J);F = abs(J1);J2 = fftshift(F);figure imshow(J2,[5 50])练习结果与分析 1)练习结果如图4.4所示.Part 3 选取一幅图像,进行离散余弦变换,并对其进行离散余弦反变换,观察其结果。 %对***.jpg文件计算二维DCT变换 RGB = imread('***.jpg ');figure(1)imshow(RGB)I = rgb2gray(RGB);%真彩色图像转换成灰度图像 J = dct2(I);%计算二维DCT变换 figure(2)imshow(log(abs(J)),[])%图像大部分能量集中在上左角处 figure(3);J(abs(J)< 10)= 0;%把变换矩阵中小于10的值置换为0,然后用idct2重构图像 K = idct2(J)/255;imshow(K)练习结果与分析 数字图像处理学习报告 在这一学期,我选修了《数字图像处理基础》这门课程,同时,老师还讲授了一些视频处理的知识。在这里,梳理一下这学期学到的知识,并提出一些我对这门课程的建议。 图像处理是指对图像信息进行加工,从而满足人类的心理、视觉或者应用的需求的一种行为。图像处理方法一般有数字法和光学法两种,其中数字法的优势很明显,已经被应用到了很多领域中,相信随着科学技术的发展,其应用空间将会更加广泛。数字图像处理又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程.数字图像处理是从20世纪60年代以来随着计算机技术和VLSL的发展而产生、发展和不断成熟起来的一个新兴技术领域。数字图像处理技术其实就是利用各种数字硬件与计算机,对图像信息通过转换而得到的电信号进行相应的数学运算,例如图像去噪、图像分割、提取特征、图像增强、图像复原等,以便提高图像的实用性。其特点是处理精度比较高,并且能够对处理软件进行改进来优化处理效果,操作比较方便,但是由于数字图像需要处理的数据量一般很大,因此处理速度有待提高。目前,随着计算机技术的不断发展,计算机的运算速度得到了很大程度的提高。在短短的历史中,它却广泛应用于几乎所有与成像有关的领域,在理论上和实际应用上都取得了巨大的成就。 1.数字图像处理需用到的关键技术 由于数字图像处理的方便性和灵活性,因此数字图像处理技术已经成为了图像处理领域中的主流。数字图像处理技术主要涉及到的关键技术有:图像的采集与数字化、图像的编码、图像的增强、图像恢复、图像分割、图像分析等。 图像的采集与数字化:就是通过量化和取样将一个自然图像转换为计算机能够处理的数字形式。 图像编码:图像编码的目的主要是来压缩图像的信息量,以便能够满足存储和传输的要 求。 图像的增强:图像的增强其主要目的是使图像变得清晰或者将其变换为机器能够很容易 分析的形式,图像增强方法一般有:直方图处理、灰度等级、伪彩色处理、边缘锐化、干扰抵制。 图像的恢复:图像恢复的目的是减少或除去在获得图像的过程中因为各种原因而产生的 退化,可能是由于光学系统的离焦或像差、被摄物与摄像系统两者之间的相对运动、光学或电子系统的噪声与介于被摄像物跟摄像系统之间的大气湍流等等。 图像的分割:图像分割是将图像划分为一些互相不重叠的区域,其中每一个区域都是像素的一个连续集,通常采用区域法或者寻求区域边界的境界法。 图像分析:图像分析是指从图像中抽取某些有用的信息、数据或度量,其目的主要是想得到某种数值结果。图像分析的内容跟人工智能、模式识别的研究领域有一定的交叉。2.数字图像处理的特点 数字图像处理的特点主要表现在以下几个方面: 1)数字图像处理的信息大多是二维信息,处理信息量很大。因此对计算机的计算速度、存 储容量等要求较高。2)数字图像处理占用的频带较宽。与语言信息相比,占用的频带要大几个数量级。所以在成像、传输、存储、处理、显示等各个环节的实现上技术难度较大,成本亦高。这就对频 带压缩技术提出了更高的要求。 3)数字图像中各个像素不是独立的,其相关性大。在图像画面上,经常有很多像素有相同 或接近的灰度。所以,图像处理中信息压缩的潜力很大。 4)数字图像处理后的图像受人的因素影响较大,因为图像一般是给人观察和评价的。 3.数字图像处理的优点 数字图像处理的优点主要表现在4个方面。 1)再现性好。数字图像处理与模拟图像处理的根本不同在于它不会因图像的存储、传输或 复制等一系列变换操作而导致图像质量的退化。只要图像在数字化时准确地表现了原稿,那么数字图像处理过程始终能保持图像的再现。 2)处理精度高。将一幅模拟图像数字化为任意大小的二维数组,主要取决于图像数字化设 备的能力.3)适用面宽。图像可以来自多种信息源,它们可以是可见光图像,也可以是不可见的波谱图像。只要针对不同的图像信息源,采取相应的图像信息采集措施,图像的数字处理方法 适用于任何一种图像。 4)灵活性高。图像处理大体上可分为图像的像质改善、图像分析和图像重建三大部分,每 一部分均包含丰富的内容。 4.数字图像处理的应用领域 图像是人类获取和交换信息的主要来源,因此,图像处理的应用领域必然涉及到人类生 活和工作的方方面面,随着人类活动范围的不断扩大,图像处理的应用领域也将随之不断扩 大。 航天和航空技术:在飞机遥感和卫星遥感技术中用配备有高级计算机的图像处理系统来判读分析,既节省人力又加快了速度,还可以从照片中提取人工所不能发现的大量有用情报。生物医学工程:除了CT技术之外,还有对医用显微图像的处理分析,如红细胞、白细胞分类,染色体分析,癌细胞识别等。 通信工程:当前通信的主要发展方向是声音、文字、图像和数据结合的多媒体通信。在一定意义上讲,编码压缩是这些技术成败的关键。除了已应用较广泛 的熵编码、DPCM编码、变换编码外,目前国内外正在大力开发研究新的编码方法,如分行编码、自适应网络编码、小波变换图像压缩编码等。 工业和工程领域:图像处理技术有着广泛的应用,如自动装配线中检测零件的质量并对零件进行分类,印刷电路板疵病检查,弹性力学照片的应力分析,流体力学图片的阻力和升力分析,邮政信件的自动分拣,在一些有毒、放射性环境内识别工件及物体的形状和排列状态,先进的设计和制造技术中采用工业视觉等等。 军事方面:图像处理和识别主要用于导弹的精确末制导 各种侦察照片的判读,具有图像传输、存储和显示的军事自动化指挥系统,飞机、坦克和军舰模拟训练系统等;公安业务图片的判读分析,指纹识别,人脸鉴别,不完整图片的复原,以及交通监控、事故分析等。 文化艺术:电视画面的数字编辑、动画的制作、电子图像游戏、纺织工艺品设计、服装设计与制作、发型设计、文物资料照片的复制和修复、运动员动作分析和评分等等。 视频和多媒体系统:电视制作系统广泛使用的图像处理、变换、合成,多媒体系统中静止图像和动态图像的采集、压缩、处理、存贮和传输等。 电子商务:图像处理技术在电子商务中也大有可为,如身份认证、产品防伪、水印技术等。 在这门课程的最后,代课老师给我们讲授了数字视频处理,让我们了解到数字视频就是以数字形式记录的视频,和模拟视频相对的。数字视频有不同的产生方式,存储方式和播出方式。比如通过数字摄像机直接产生数字视频信号,存储在数字带,P2卡,蓝光盘或者磁盘上,从而得到不同格式的数字视频。然后通过PC,特定的播放器等播放出来。了解了数字视频发展过程和视频压缩的概念和分类等。 我们这门课程主要是上理论课,其中有很复杂的数学原理,专业术语多,基础知识要求高,理解起来有些困难。当初选择这门课是希望能有一些具体软件的教学。就我了解,视频处理的软件有MAYA、Premiere、绘声绘影、windows自带的MOVE MAKER;处理数字图像的软件主要有matlaB、photoshop、ImageJ(java图像处理程序)。其中,matlaB和PS 很具有教学性,这两个软件也运用的很广。 MATLAB全称是MatrixLaboratory(矩阵实验室),一开始它是一种专门用于矩阵数值计算的软件,从这一点上也可以看出,它在矩阵运算上有自己独特的特点。实际运用MATLAB中的绝大多数的运算都是通过矩阵这一形式进行的,这一特点决定了MATLAB在处理数字图像上的独特优势。理论上讲,图像是一种二维的连续函数,然而计算机对图像进行数字处理时,首先必须对其在空间和亮度上进行数字化,这就是图像的采样和量化的过程。 Photoshop是Adobe公司旗下最为出名的图像处理软件之一,集图像扫描、编辑修改、图像制作、广告创意,图像输入与输出于一体的图形图像处理软件,深受广大平面设计人员和电脑美术爱好者的喜爱。 如果能理论和实践相结合,相信我们会把数字图像处理理解的跟透彻,同时也锻炼了大家的动手能力。希望老师能多开设实际动手的课程。第二篇:《数字图像处理》
第三篇:数字图像处理
第四篇:数字图像处理上机报告
第五篇:数字图像处理学习报告