说话算数,许诺的上海决赛详细情况记录。


项目名称

数字图像处理教学辅助虚拟实验平台

项目平台

matlab GUI

项目简述

利用matlabGUI可视化,设计一个方便数字图像处理教学的虚拟实验平台,加深学生兴趣,让学生直观了解。

项目框架

虚拟实验平台分为实验主窗口和手写数字识别案例。

原理相关

数字图像处理是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。可以用来提高图像的视感质量,提取图像中所包含的某些特征或特殊信息,对图像数据进行变换、编码和压缩,以便于图像的存储和传输。
最近邻插值法
最近邻插值法nearest_neighbor是最简单的灰度值插值。也称作零阶插值,就是令变换后像素的灰度值等于距它最近的输入像素的灰度值。
双三次插值法
双三次插值是一种更加复杂的插值方式,它能创造出比双线性插值更平滑的图像边缘。又叫双立方插值,用于在图像中“插值”(Interpolating)或增加“像素”(Pixel)数量/密度的一种方法。通常利用插值技术增加图形数据,以便在它打印或其他形式输出的时候,能够增大打印面积以及(或者)分辨率。
属性:通过双三次插值可以得到一个连续的插值函数,它的一阶偏导数连续,并且交叉导数处处连续。
公式:
计算系数 的过程依赖于插值数据的特性。如果已知插值函数的导数,常用的方法就是使用四个顶点的高度以及每个顶点的三个导数。一阶导数 与 表示 x 与 y 方向的表面斜率,二阶相互导数 表示同时在 x 与 y 方向的斜率。这些值可以通过分别连续对 x 与 y 向量取微分得到。对于网格单元的每个顶点,将局部坐标(0,0, 1,0, 0,1 和 1,1) 带入这些方程,再解这 16 个方程。

图像增强
1.直方图作用
直方图的观看规则就是“左黑右白”,左边代表暗部,右边代表亮部,而中间则代表中间调。
纵向上的高度代表像素密集程度,越高,代表的就是分布在这个亮度上的像素很多。

2.分为空间域和频域
空域分为点运算和领域去噪
直方图修正属于点运算,平滑和锐化属于领域去噪。
平滑是在添加噪声之后进行的处理
滤波的本义是指信号有各种频率的成分,滤掉不想要的成分,即为滤掉常说的噪声,留下想要的成分.这即是滤波的过程,也是目的。
图像锐化是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空域处理和频域处理两类。
图像平滑往往使图像中的边界、轮廓变得模糊,为了减少这类不利效果的影响,这就需要利用图像锐化技术,使图像的边缘变的清晰
直方图修正法
分为直方图均衡化和直方图规定化(直方图匹配)
目的:采用直方图修整后可使图像的灰度间距拉开或使灰度分布均匀,从而增大反差,使图像细节清晰,从而增强图像。
直方图均衡化:通过对原图像进行某种变换使原图像的灰度直方图修正为均匀的直方图的一种方法。
直方图规定化:使原图像灰度直方图变成规定形状的直方图而对图像作修正的增强方法。

频域增强
频谱图
图像从圆心到外是由低频到高频的一个过程 同心圆表示在不同方向上的同一频率 而频谱有明暗表示分解成的多个正弦波由于相位的不同叠加后就形成了有大小的分别 而相位不同的正弦波又是由在不同位置的原图像的圆(也是不同位置的频率变化组成的)
图像分割
方法:阈值分割、区域分割、边缘分割、基于特定理论的分割
图像分割方法依照分割时所依据的图像特性不同,大致可以分为四大类。第一类是阈值方法,这种方法是根据图像灰度值得分布特性确定某个阈值来进行图像分割的。第二类为边缘检测方法,这类方法是通过检测出封闭某个区域的边界来进行图像分割的。通俗地讲,这类方法实际上是沿着闭合的边缘线将其包围的区域剪切出来。第三类方法是区域提取方法,这类方法的特点是根据特定区域与其他背景区域特性上的不同来进行图像分割的。另外,还有一种基于形态学的分水岭算法。
阈值分割:基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。
常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。
设原始图像为f(x,y),按照一定的准则f(x,y)中找到特征值T,将图像分割为两个部分,分割后的图像为:若取:b0=0(黑),b1=1(白),即为我们通常所说的图像二值化。
直方图阈值双峰法:双峰法是一种简单的阈值分割方法,即如果灰度级直方图呈现明显的双峰状,则选双峰之间的谷底所对应的灰度级作为阈值分割。
均匀性度量法:
均匀性度量法的设计思想是,假设当图像被分为目标物和背景两个类别时,属于同一类别内的像素值分布应该具有均匀性。在这里采用方差来度量像素间的均匀性。设原图像为f(x,y),结果图像为g(x,y)。
类间最大方差法(Otsu法):
Otsu是一种使类间方差最大的自动确定阈值的方法,该方法具有简单、处理速度快的特点,是一种常用的阈值选取方法。MATLAB中的graythresh函数求取阈值采用的就是Otsu法。
局部阈值法:局部阈值图像分割的原理与全局阈值分割相似,只是在使用之前的程序前,将图像分割成若干子图像进行处理,在处理后,在将各自的结果拼接起来。
边缘检测:最简单的边缘检测方法是边缘检测算子,它利用相邻区域的像素值不连续的性质,采用一阶或二阶导数来检测边缘点。
边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。 这些包括(i)深度上的不连续、(ii)表面方向不连续、(iii)物质属性变化和(iv)场景照明变化。 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。
图像分割的意义
图像分割是图像分析的第一步,图像分割接下来的任务,如特征提取、目标识别等的好坏,都取决于图像分割的质量如何。
图像变换
Fourier变换有两个好处,即:可以获得信号的频域特性;可以将卷积运算转换为乘积运算。
因此二维Fourier变换的应用也是根据这两个特点来进行的。
在图像滤波中的应用
首先,我们来看Fourier变换后的图像,中间部分为低频部分,越靠外边频率越高。因此,我们可以在Fourier变换图中,选择所需要的高频或是低频滤波。
离散余弦变换,尤其是它的第二种类型,经常被信号处理和图像处理使用,用于对信号和图像(包括静止图像和运动图像)进行有损数据压缩。这是由于离散余弦变换具有很强的”能量集中”特性:大多数的自然信号(包括声音和图像)的能量都集中在离散余弦变换后的低频部分,而且当信号具有接近马尔科夫过程(Markov processes)的统计特性时,离散余弦变换的去相关性接近于K-L变换(Karhunen-Loève 变换–它具有最优的去相关性)的性能。
图像的形态学
数字图像处理中的形态学处理是指将数字形态学作为工具从图像中提取对于表达和描绘区域形状有用处的图像分量,比如边界、骨架以及凸壳,还包括用于预处理或后处理的形态学过滤、细化和修剪等。图像形态学处理中我们感兴趣的主要是二值图像。
在二值图像中,所有黑色像素的集合是图像完整的形态学描述,二值图像的各个分量是Z2的元素。假定二值图像A和形态学处理的结构元素B是定义在笛卡儿网格上的集合,网格中值为1的点是集合的元素,当结构元素的原点移到点(x,y)时,记为Sxy,为简单起见,结构元素为3x3,且全都为1,在这种限制下,决定输出结果的是逻辑运算。
膨胀和腐蚀这两种操作是形态学处理的基础,许多形态学算法都是以这两种运算为基础的。
开操作是先腐蚀、后膨胀处理。闭操作是先膨胀、后腐蚀处理。
腐蚀和膨胀,看上去好像是一对互逆的操作,实际上,这两种操作不具有互逆的关系。
开运算和闭运算正是依据腐蚀和膨胀的不可逆性,演变而来的。
先腐蚀后膨胀的过程就称为开运算。
闭运算是通过对腐蚀和膨胀的另一种不同次序的执行而得到的,
闭运算是先膨胀后腐蚀的过程,其功能是用来填充物体内细小空洞、连接邻近物体、平滑其边界,同时不明显改变不明显改变其面积。

#相关函数
有关函数的意义
inputdlg 输入对话框
创建一个输入对话框,prompt为提示字符串,title为对话框名称,num_line为显示的行数,defans为默认的数值

imresize 缩放
‘nearest’:改变图像尺寸时采用最近邻插值算法;
‘bilinear’:采用双线性插值算法;
‘bicubic’: 采用双三次插值算法

msgbox 创建对话框
imshow 显示图像
ndims 求一个数组维数

numel 计算数组中满足指定条件的元素个数
若是一幅图像,则numel(A)将给出它的像素数。

I(:,:,1)
:在矩阵引用里,表示所有元素。
比如一个二维矩阵A,A(:,1)就表示A的第一列元素。

flipl中提供了许多对矩阵操作的函数,可以实现矩阵的三角矩阵的提取(triu、tril)、矩阵的翻转(flipud、fliplr、Flipdim)和旋转(rot90)等各种操作。

size
size(X,1),返回矩阵X的行数;
size(X,2),返回矩阵X的列数;
N=size(X,2),就是把矩阵X的列数赋值给N
size():获取矩阵的行数和列数
(1)s=size(A),
当只有一个输出参数时,返回一个行向量,该行向量的第一个元素时矩阵的行数,第二个元素是矩阵的列数。
(2)[r,c]=size(A),
当有两个输出参数时,size函数将矩阵的行数返回到第一个输出变量r,将矩阵的列数返回到第二个输出变量c。
(3)size(A,n)如果在size函数的输入参数中再添加一项n,并用1或2为n赋值,则 size将返回矩阵的行数或列数。其中r=size(A,1)该语句返回的时矩阵A的行数, c=size(A,2) 该语句返回的时矩阵A的列数。

imrotate 旋转
B = imrotate(A,angle,method,bbox)
将图像A(图像的数据矩阵)绕图像的中心点旋转angle度, 正数表示逆时针旋转, 负数表示顺时针旋转。返回旋转后的图像矩阵。
使用method参数可以改变插值算法,method参数可以为下面这三个值:
‘nearest’:最邻近线性插值(Nearest-neighbor interpolation)
‘bilinear’: 双线性插值(Bilinear interpolation)
‘bicubic’: 双三次插值(或叫做双立方插值)(Bicubic interpolation)
bbox参数用于指定输出图像属性:
‘crop’: 通过对旋转后的图像B进行裁剪, 保持旋转后输出图像B的尺寸和输入图像A的尺寸一样。
‘loose’: 使输出图像足够大, 以保证源图像旋转后超出图像尺寸范围的像素值没有丢失。 一般这种格式产生的图像的尺寸都要大于源图像的尺寸。

imadd 两个图像相加,或者一个图像加上一个常量
imsubstract 两个图像相减,或者一个图像减掉一个常量
immultiply 两个图像相乘,或者一个图像乘上一个常量
imdivide 两个图像相除,或者一个图像除以一个常量
imabsdiff 两个图像的差的绝对值
imcomplement 求一个图像的反色图
inlincomb 求一组图像的线性组合
imadjust 调节灰度图像的亮度或彩色图像的颜色矩阵

histeq 直方图均衡
bar(x,y) 其中x必须是严格递增的且一维向量x和一维向量y长度相同。以一维向量x的值为x坐标,对应的y为y坐标画直方图。

var函数实际上求的并不是方差,而是误差理论中“有限次测量数据的标准偏差的估计值”。

graythresh函数用法:使用最大类间方差法找到图片的一个合适的阈值(threshold)。在使用im2bw函数将灰度图像转换为二值图像时,需要设定一个阈值,这个函数可以帮助我们获得一个合适的阈值。利用这个阈值通常比人为设定的阈值能更好地把一张灰度图像转换为二值图像。

手写归纳

手写数字模块小结
handwrite
1.exit函数,存在即返回非0值,不存在即返回0
2.load template pattern; %将template文件中的pattern加载到工作环境中
3.pattern(1,1).num=0; %pattern是一个数组,这里.num表示样本数量
4.pattern(1,1).feature=[]; %.feature表示特征值(样本)
5.save template pattern; %将pattern保存在template.mat文件中
6.pos0=get(handles.WritingAxes,’currentpoint’);
%获取最近一次点击的位置,返回一个2x3的矩阵,矩阵的每行代表一个点的坐标
这两个点的具体含义,和坐标系的投影类型以及鼠标点击位置是否位于坐标系内有关。对于典型情况(正交投影,鼠标点击位于坐标系范围内),可以通过鼠标点击的位置,作一条垂直于屏幕的直线,则该线与坐标系的六个面必然会有两个交点(想象一下,2D坐标系的外框是一个矩形,3D坐标系外框是一个长方体),这两个交点的坐标就是上面所说的pos0,其第一行是靠近观察者的那个面上的点,而第二行是离观察者稍远的那个面上的点。
7.x0=pos0(1,1); %靠近观察者那个面上点的第一个坐标(即x)
y0=pos0(1,2); %靠近观察者那个面上点的第一个坐标(即y)
8.line(x,y, ‘marker’, ‘.’,’markerSize’,18, ‘LineStyle’,’-‘,’LineWidth’,2,’Color’,’black’);
%默认选择黑笔画线,设定点的模型大小,线的模型宽度颜色
9.X=x0:stepX:x; %设定坐标参数,0.1单位
Y=(y-y0)(X-x0)/(x-x0)+y0; %两点直线方程
11.Img=getframe(handles.WritingAxes); %获取坐标轴内图像
%getframe获得的是一个架构struct类型的数据,其中cdata子域的内容才可以用imwrite内容保存,用Img.cdata表示,是截取区域的数据
12.imwrite(I,’当前手写数字.bmp’,’bmp’); %将图像数据写入图像文件
13.data=GetFeature(I); %对手写数字进行处理,获取特征向量
14.pattern(1,1).num=pattern(1,1).num+1; %样本容量加一
15.pattern(1,1).feature(:,pattern(1,1).num)=data;
%新增样本(保存的是特征向量)放在最后
16.pattern(1,1).num=pattern(1,1).num-1; %样本容量减一
17.pattern(1,1).feature(:,pattern(1,1).num)=[]; %删除倒数第二个
18.set(handles.RecognitionResult,’String’,Result); %显示识别结果
feature
1.[row,col]=find(I==0); %返回数字的上下左右的边界
2.I=I(min(row):max(row),min(col):max(col));
%截取手写数字图像,使其紧包含数字边界,不包含多余的空白
3.[row,col]=size(I); %求截取后图像的宽和高,数组的行和列
4.r=fix(row/5); %fix朝0方向取整
5.data=data’; %将当前手写数字的特征向量由行向量变为列向量
BayesTwoValue
1.sum = sum+pattern(1,i).num; %样本总数求和
2.pw(i) = pattern(1,i).num/sum; %每个数字的样本概率,先验概率
3.[maxval,maxpos] = max(pwx); %取后验概率中最大的
%第一个参数是序列中的最大值 第二个参数是最大值在序列中位置
4.Result= maxpos-1; %最大值即为最匹配的数字,其数值为它所处位置序号减一
BayesLeastError
1.[pc_template,pc_data]=pcapro(data); %主成分分析
2.mean_data(i).data=mean(pattern(1,i).feature’)’; %求各个类型样品的平均值
%mean(x)表示对列向量x求平均值
3.h(i)=(pc_data-mean_data(i).data)’
s_inv(i).data(pc_data-mean_data(i).data)… (-0.5)+log(pw(i))+log(abs(s_det(i)))*(-0.5); %判别函数
BayesLeastRisk
1.[minval minpos]=min(risk); %取损失最小的

答辩

我们准备的答辩稿(部分):
思路:
为更好的协助老师的教学,充实课堂内容,从而设计的辅助教学实验软件,并拓展手写数字识别系统,用来丰富课堂知识。
首先我们选择matlab软件来设计虚拟实验平台,因为大部分工科院校都或多或少 接触过matlab,上手容易。然后由于MatlabGUI强大的可视化界面,让我们决定实现它。一开始我们只设计了手写数字识别,但感觉过于单一,且只涉及到数字图像处理中数字识别模式识别这一块,不够全面,而且学生初学时是从最基本的操作学起,因此,我们根据学习顺序,补充了每一章节的基本实验,使我们的平台更加完善。

遇到的困难:
主要就是程序的问题,这是一个很需要耐心细心的模块,经常会遇到各种奇怪的问题,比如某个功能失效,界面无响应这些,其次就是生成的可执行文件不能很好的适应所有电脑,拓展模块里的手写也可能因为样本的不足出现错误,所以样本的填充也很复杂很需要时间。

作品的优点和缺点:
优点:操作相对简单,界面比较整洁,知识覆盖面广
缺点:可执行文件适应性不够强,部分功能有延迟,没有更详细的解释相关操作的意义,可能还需要一个使用说明的嵌入模块,手写数字模块样本容量不够大。
运用技术:
软件的设计基本上全部由matlab/GUI 完成,并使用其特定的命令生成可执行文件,编程时运用了各种简单或复杂的算法,如缩小放大的最近邻插值法,双三次插值法,图像增强里的直方图均衡化、阈值分割的直方图双峰法、均匀性度量法、otsu法、局部阈值法等等。这对于我们两个没有系统学习过这门课的人来说,还是很具有挑战性。
贝叶斯决策的原理。
贝叶斯决策理论方法是统计模型决策中的一个基本方法,其基本思想是:
已知类条件概率密度参数表达式和先验概率。
利用贝叶斯公式转换成后验概率。
根据后验概率大小进行决策分类。
这个手写识别案例的用处:
是对这门课程的一个拓展,通过对写入的图像灰度化,裁剪,提取特征参数,与贝叶斯决策结合,进行概率分析,匹配,显示最符合的数字,算是部分操作的小应用,同时也涉及到数字图像处理较难的部分:模式识别一块;同时可以用来延伸出车牌识别或人脸识别等更高级的应用系统。

现场老师问了几个问题,回忆了下,有问和PS的区别和项目的意义。

项目获奖

第九届中国计算机设计大赛国家三等奖、中南赛区二等奖

P.S.配图为我设计的作品海报。