分别利用jay robertss、Prewit...

接地对区域内像素的连通性有一定的要求或限定;需要指出的是,实际应用中图像分割不仅要把一幅图像;在图像工程中,图像分割是由图像处理过渡到图像分析;图像分割在实际中已得到广泛的应用,例如在工业自动;1.2传统的图像分割方法;1.2.1基于边界的分割方法;基于边界的分割方法是利用不同区域间像素灰度不连续;阶微分算子有Laplace和Kirsh算子等;1.2.2基于
接地对区域内像素的连通性有一定的要求或限定。
需要指出的是,实际应用中图像分割不仅要把一幅图像分成满足以上五个条件的各具特性的区域,而且需要把其中感兴趣的目标区域提取出来,只有这样才算是真正的完成了图像分割任务。
在图像工程中,图像分割是由图像处理过渡到图像分析的关键步骤:一方面,它是目标表达的基础,对特征测量有重要影响;另一方面,因为图像分割及其基于分割的目标表达、特征提取和参数测量等将原始图像转化为更抽象更紧凑的形式,使得更高层的图像分析和理解成为可能。
图像分割在实际中已得到广泛的应用,例如在工业自动化,在线产品检测,生产过程控制,文档图像处理,遥感和生物医学图像分析,保安监视,以及军事,体育,农业工程等方面。概括来说,在各种图像应用中,只要需对图像目标进行提取,测量等都离不开图像分割。可见,图像分割在图像工程中有着十分重要的地位和影响。
1.2 传统的图像分割方法
1.2.1基于边界的分割方法
基于边界的分割方法是利用不同区域间像素灰度不连续的特点检测出区域间的边缘,从而实现图像分割。边缘检测是所有基于边界分割方法的第一步,根据处理的顺序,边缘检测可分为并行边缘检测和串行边缘检测。图像中相邻的不同区域间总存在边缘,边缘处像素的灰度值不连续,这种不连续性可通过求导数来检测到。对于阶跃状边缘,其位置对应一阶导数的极值点,对应二阶导数的过零点(零交叉点)。因此常用微分算子进行边缘检测,它是一种并行边界技术。常用的一阶微分算子有Roberts、Prewit、和Sobel算子、二
阶微分算子有Laplace和Kirsh算子等。在实际中各种微分算子常用小区域模板来表求,微分运算是利用模板与图像卷积来实现。这些算子对噪声敏感,只适合于噪声较小不太复杂的图像。由于边缘和噪声都是灰度不连续点,在频域均为高频分量,直接采用微分运算难以克服噪声的影响。因此用微分算子检测边缘前要对图像进行平滑滤波。Log算子和Canny算子是具有平滑功能的二阶和一阶微分算子,边缘检测效果较好。其中Log算子是采用Laplacian算子求高斯函数的二阶导数。Canny算子是高斯函数的一阶导数,它在噪声抑制和边缘检测之间取得了较好的平衡。串行边界查找法是先检测边缘再串行连接成闭合边界的方法,这种方法在很大程度上受起始点的影响。图搜索是其中一种典型的方法,边界点和边界段可以用图结构表示。通过在图中进行搜索对应最小代价的路径可以找到闭合边界,它是一种全局的方法。在噪声较大时效果仍很好,但这种方法比较复杂,计算量也很大。在许多情况下,为加快运算速度常常使用动态规划的优化方法,它是借助有关具体问题的启发性知识减少搜索,只求次优解的方法。
1.2.2基于阈值的分割方法
阈值分割方法的历史可追溯到近40年前,现己提出了大量算法,对灰度图像的阈值分割就是先确定一个处于图像灰度取值范围之中的灰度阈值,然后将图像中各个像素的灰度值都与这个阈值相比较,并根据比较结果将对应的像素分为两类。这两类像素一般分属图像的两类区域,从而达到分割的目的。从该方法中可以看出,确定一个最优阈值是分割的关键。现有的大部分算法都是集中在阈值确定的研究上。阈值分割方法根据图像本身的特点,可分为单阈值分割方法和多阈值分割方法;也可分为基于像素值的阈值分割方
法、基于区域性质的阈值分割方法和基于坐标位置的阈值分割方法。若根据分割算法所有的特征或准则,还可以分为直方图与直方图变换法、最大类间方差法、最小误差法与均匀化误差法、共生矩阵法、最大熵法、简单统计法与局部特性法、概率松弛法、模糊集法、特征空间聚类法、基于过渡区的阈值选取法等。阈值分割的优点是计算简单,运算效率较高,速度快。全局阈值对于灰度相差很大的不同目标和背景能进行有效的分割。当图像的灰度差异不明显或不同目标的灰度值范围有重叠时,应采用局部阈值或动态阈值分割法。另一方面这种方法只考虑像素本身的灰度值,一般不考虑空间特征,因而对噪声很敏感。在实际应用中,阈值法通常与其他方法结合使用。
1.2.3基于区域分割的图像分割方法
区域分割的实质就是把具有某种相似性质的像素连通起来,从而构成最终的分割区域。它利用了图像的局部空间信息,可有效的克服其它方法存在的图像分割空间不连续的缺点,但它通常会造成图像的过度分割。在此类方法中,如果从全图出发,按区域属性特征一致的准则,决定每个像元的区域归属,形成区域图,这常称之为区域生长的分割方法;如果从像元出发,按区域属性特征一致的准则,将属性接近的连通像元聚集为区域是区域增长的分割方法;若综合利用上述两种方法,就成为分裂一合并的方法。区域生长法的基本思想是将具有相似性质的像素合起来构成区域,具体做法是先给定图像中要分割的目标物体内的一个小块或者说种子区域,再在种子区域的基础上不断将其周围的像素点以一定的规则加入其中,达到最终将代表该物体的所有像素点结合成一个区域的目的,该方法的关键是要选择合适的生长或相似准则。生长准则一般可分为3种:基于区域灰度差准则、基于区域内灰度
分布统计性质准则和基于区域形状准则。
区域生长法要解决的主要问题是区域生长准则的设计和算法的高效性。生长准则往往和具体问题有关,直接影响最后形成的区域,如果选取不当,就会造成过分割和欠分割的现象。区域生长法的优点是计算简单,对于较均匀的连通目标有较好的分割效果。它的缺点是需要人为确定种子点,对噪声敏感,可能导致区域内有空洞。另外,它是一种串行算法,当目标较大时,分割速度较慢。因此在设计算法时,要尽量提高效率。
分裂合并法是先将图像看成很多的一致性较强的小区域,再按一定的规则将小区域融合成大区域,达到分割图像的目的。分裂合并法的基本思想是从整幅图像开始通过不断分裂合并得到各个区域。分裂合并法的关键是分裂合并准则的设计。这种方法对复杂图像的分割效果较好,但算法较复杂,计算量大,分裂还可能破坏区域的边界。
1.3 特殊理论工具的图像分割方法
图像分割至今为止尚无通用的自身理论。近年来,随着各学科许多新理论和新方法的提出,人们也提出了许多与一些特定理论、方法和工具相结合的分割技术。
(1).基于数学形态学的分割技术。其基本思想是用具有一定形态的结构元素去量度和提取图像中的对应形状以达到对图像分析和识别的目的。如基于图像最大内切圆的数学形态学形状描述图像分割算法和基于目标最小闭包结构元素的数学形态学形状描述图像分割算法、分水岭区域分割法和聚类快速分割法等。由于形态学对图像分割具有优异的特性,使其在未来的图像分割中起主导作用。但该方法的主要缺陷还不能很好地解决耗时问题,将其与一
些节约时间的措施结合起来,是图像分割的一种趋势。
(2).基于模糊技术的图像分割方法。基于模糊集合和逻辑的分割方法是以模糊数学为基础,利用隶属解决图像中由于信息不全面、不准确、含糊、矛盾等造成的不确定性问题,该方法在医学图像分析中有广泛的应用。
(3).基于人工神经网络技术的图像分割方法。基于神经网络的分割方法的基本思想是通过训练多层感知机来得到线性决策函数,然后用决策函数对像素进行分类来达到分割的目的。近年来,还出现了人工神经网络技术和模糊技术结合应用于图像分割中的方法。
(4).遗传算法在图像分割中的应用。遗传算法是基于进化论自然选择机制的、并行的、统计的、随机化搜索方法。
(5).基于小波分析和变换的分割技术,是一种多尺度多通道分析工具,比较适合对图像进行多尺度的边缘检测。
1.4 图像分割的评价
1.4.1 各种图像分割方法分割图像的基本依据和条件
分析各种图像分割方法可以发现以下几方面:
(1).分割的图像区域应具有同质性,它们分割图像的基本依据和条件有以下如灰度级别相近、纹理相似等。
(2).区域内部平整,不存在很小的小空洞。
(3).相邻区域之间对选定的某种同质判据而言,应存在显著差异性。
(4).每个分割区域边界应具有齐整性和空间位置的准确性。
现有的大多数图像分割方法只是部分满足上述判据。如果加强分割区域的同性质约束,分割区域很容易产生大量小空洞和不规整边缘;若强调不同
包含各类专业文献、外语学习资料、高等教育、中学教育、各类资格考试、生活休闲娱乐、32基于数学形态学的图像分割方法研究毕业论文等内容。 
 图像分割毕业论文_理学_高等教育_教育专区。大连交通...(论文) 第二章 图像分割方法研究综述 2.1 概述...2.5.1基于数学形态学的分割技术此技术的基本思想是...  1 文献综述 课题:基于数学形态学的图像边缘检测方法研究边缘检测是图像分割的核心内容,而图像分割是由图像处理 到图像分析的关键步骤,在图像工程中占据重要的位置,对...  基于形态学的图像分割算法研究_数学_自然科学_专业资料。基于形态学的图像分割算法研究 【摘要】本设计论述了基于数学形态学的图像边缘检测算法的研 究。利用形态学算...  课程设计(论文) 课程名称: 题目: 科研训练 图像分割方法研究 院 (系) : ...2.4 基于数学形态学的分割方法 数学形态学是建立在集合论的基础上,用于研究几何...  基于小波变换和数学形态学的图像分割算法研究 【摘要】 针对传统的分水岭变换对...易发表网提供各学科期刊论文下载、毕业论文...
文档数 浏览...  龙源期刊网 .cn 一种基于综合集成和数学形态学的图像分割 方法 作者:郇述良 任强 来源:《现代电子技术》2008 年第 18 期 摘要:图像...  浅析图像分割的原理及方法一.研究背景及意义研究背景:随着人工智能的发展,机器人...4、基于数学形态学的边缘检测。 最后通过图像的轮廓(边界)跟踪来确定目标区域: ...  UNIVERSITY OF TECHNOLOGY 毕业论文题目 图像分割技术研究 学生姓名 学号 通信工程...基于数学形态学的分割技术的基本思想是用具有一定形态的结构元素去量度和提取图像...  的图像分割算法进行了较全面的叙述,分别研究了基于边缘、区域和形态学分水岭法 ...目前越来越多的学者开始将数学形态学、模糊理论、 遗传算法理论、分形理论和小波...疵点缺陷识别算法
& 区域识别的目的是寻找并确定目标的分布位置与状态。目标区域的识别方法一般是先用二值化方法确定该区域,形成一个个斑点,然后使用适当的特征来描述这些斑点。为了能够较为精确地描述目标区域,通常要在二值化之前采取适当的办法来提升各区域的边界,即进行边缘检测。它与点检测、线检测统称为图像目标检测。边缘检测的方法比较多,如梯度估计!边缘特征模板与图像的卷积等,本文将该类算子分为两类,分别为常用的经典算子和一些特色检测算子。
&&&&在增强目标区域的边缘后,下一步将该边缘完整提取出来。提取边缘的过程实际上是阈值分割的过程。由于闭值分割比较重要,也容易操作,因此目前效果较好的阂值分割方法研究很多,如全局阈值分割方式、局部统计阈值分割、基于种子增长的阈值分割、自适应阈值分割、最优阈值分割等常用的分割方式。模糊闺值分割是现在研究的热点,它是在模糊理论的基础上提出的。因为目标的边缘本来就有一定的模糊性,特别是在多干扰的复杂图像中更是如此,而建立在模糊集基础上模糊阈值分割方式恰好可以解决这一问题。理论上讲,使用模糊集的实际分割具体效果好坏取决于能否选择合适的隶属函数,而这是非常困难的。本文提出一种基于自适应门限的疵点区域分割方法,实验证明其在复杂的背景中能很好地提取目标边缘。
经过阈值分割后的图像变为二值图像,实际上是一个个斑点。一般此时并不能直接提取斑点特征,其原因较多,如:阈值分割后的图像边缘并不一定是连续的,阈值分割后的边缘点可能需要纠正(并不一定完全反应边缘)、存在不期望的噪声点干扰等,因此,边缘提取后的图像需要一个后处理。后处理的方法可以采用形态学的方法、也可以是图论、向量机等。其后,是对各斑点进行标定和特征提取,其中比较耗时的是斑点标定。本文提出基于形态学的疵点快速标记算法和基于窗线扫面的疵点聚类方法,其执行效率会提高几倍,在斑点较多时可以提高几十倍甚至更高"疵点识别过程如图1所示。
图1疵点识别过程
在基于机器视觉的坯布表面质量检测系统中,疵点通常是湮没在复杂的背景中,将疵点从其中分割出来是疵点检测最重要的问题。疵点的分割是否准确和稳定,以及分割方法对各种疵点的适应性都直接决定了检测系统的检测性能。合理的疵点边缘增强是确保准确检出疵点的有效手段。
1.1经典算子
(1)基于空间卷积的边缘检测方式
对于图像f(x,y),在坐标(x,y)上的梯度可通过一个二维列向量来定义。梯度向量是线性算子,向量的模则不是;梯度向量的偏导数并非各向同胜的,但梯度向量的模是各向同性的。习惯上把梯度向量的模称之为梯度。这个值计算起来较为简单,并且保持着灰度的相对变化,但各向同性特性消失了。除了来自信号处理的方法外,还有一些比较经验的一阶微商方法,比如对图像或其微商的局部估算。当然,如果噪声干扰较大时,应使用较大的滤波模板,这些模板是反对称的。以下是几种经常使用的一阶边缘检测算子,这些算子均为零相位滤波,即以一个像素点为中心。在具体操作时,用模板对应乘积,然后求和的绝对值。把模板旋转π/2,重复相同的操作。
实验1:将已知三种疵点(图2a、b、c)的图像分别运用RobertS算子、Prewit算子、Sobel算子进行边界检测效果如下:
图2&&不同边缘增强算子对坯布疵点检测效果比较图
图3&&拉普拉斯算子边缘检测效果
图3为运用拉普拉斯算子对以上三种疵点(图2a、b、c)进行边缘检测的结果。可以发现拉普拉斯变换对噪声点非常敏感,使用之前应对图像先进行强平滑。通常平滑时使用较多的是高斯滤波器,因为它具有很多特性,如自复制性、可分离性、多项式序列的极限、样条逼近等,这些性质可以使得其实现更快。很多场合中,上述经典的边缘检测算子可以与某一基本的图像平滑算子做卷积运算,或以其它方式相组合,从而形成新的算子,LOG、SOG、DOG、DOB等。其中LOG与SOG分别是拉普拉斯算子、Sobel算子与低通高斯滤波卷积运算,相当于对图像做高斯滤波和拉普拉斯增强两种操作(注意卷积无先后),使用同样大小的模板可减少计算量,但效果较两种处理分别进行差。而DOG则是将两个高斯滤波器差分运算,它的波形与LOG相似,但能更好地模仿视觉系统。
(2)自适应检测算子
自适应边缘检测就是在边缘字典中,寻找符合当前状态的最佳模板。何时最佳,必须有一个测度函数,来衡量一种边缘与一个滤波后的窗之间的距离。如可用两个窗标量积来表示这个距离,设原图为f(x,y),第k个模板记为g(x,y),则对所有的k值。
(3)频域边缘检测方法
图像平滑是通过衰减傅里叶变换的高频成分来实现的,同样锐化图像的边缘也可以用衰减傅里叶域的低频成分保留某些高频成份来实现。在灰度级边缘和其它急剧变化的地方与高频部分相关,在频率内用高能滤波处理可以增强图像的边缘特征,并且衰减低频成分不会扰乱傅里叶域的高频信息。为了保持各向同性,一般使用零相移滤波器。一些常见的滤波器如理想高通滤波、巴特沃斯高通滤波、频域拉普拉斯算子、钝化模板等。
1.2坯布疵点边缘检测
观察去除纹理后的织物图像,从扫描线上可以看出目标并不是太突出,且还有大量的同类干扰。因此在二值化之前,有必要增强一下目标区域的边缘。考虑检测效果、执行效率、抑噪声能力等因素,下面选用Sobel算子、拉普拉斯算子、LOG算子、DOG算子进行实验研究,原图像为经过7x7模板的高斯低通滤波器处理后的图像,如图4所示。各算子均用提出的滤波类算子优化方法优化处理,它们的执行时间如表1所示。通过以上分析,可以看出Sobel算子在执行效果上最佳(取x与y方向上的最大值),执行效率也最高,为此,选择Sobel算子为自适应边缘检测算子。
图4&&LOG算子、DOG算子、Sobel算子边缘检测效果比较
表1&&运行时间(单位:毫秒)
2增强后边缘分割
2.1一般方法
边缘检测与闽值分割存在一些相似之处,通常将二者归为一类,统称为图像分割。严格意义上讲,边缘增强的目的不完全在于阈值分割,阈值分割的作用也不仅仅局限于提取图像的边缘,两者是独立的操作过程,但在实际操作中二者通常结合使用。
阈值分割又称为图像门限处理,因其直观和易于实现等性质,使它在图像分割应用中处于中心地位。分割后的图像便于用形态学!图论等方法处理,便于提取目标特征以用于模式识别,因而它具有十分重要的作用。
基本的分割原理与方法并不复杂,但实际操作中仍存在许多困难,这一直是国内外的研究热点。常用的阈值分割方法根据其闭值的选取方式可分为全局阈值分割、局部闭值分割、自适应阈值分割、最优闭值分割等几种,根据运算过程又可分为串行阈值分割方式和并行阈值分割方式。
2.2模糊阈值分割
概念是思维的基本形式之一,,它反映了客观事物的本质特征。一个概念有它的内涵和外延,内涵是指该概念所反映的事物本质属性的总和,也就是概念的内容。外延是一个概念所确定的对象的范围,所谓模糊概念是指这个概念的外延具有不确定性,或者说它的外延是不清晰的、模糊的。
一个模糊概念的外延是不分明的,因此在认识某一事物是否属于这一模糊概念时,不是要做出肯定或否定的结论,只要判别出该事物对这个概念的符合程度即可。于是产生了事物的隶属度,隶属度指事物隶属于这个模糊概念的程度,那么如果模糊概念的外延是一个模糊集合A,某一事物的隶属度可以记为:μA(x),它是随x变化而变化的一个关于x的函数,称为隶属函数。
目前,基于模糊理论的图像分割方法主要有模糊嫡闭值分割、模糊C均值分割(FcM)、直方图分割、基于模糊连接度图像分割、基于模糊神经网络的分割方法、基于专家知识库的分割方法等。由于模糊集合理论主要可解决模式识别中不同层次如信息不全面、不准确、含糊等不确定性问题,特别是模糊集合理论能较好的描述人类视觉中的模糊性和随机性,因而在图像分割的诸多方法中,模糊集合理论有着独特的优势。
3分割后图像的后处理
(l)常用方法
数学形态学的语言是集合论。形态学方法特别适于处理二值图像,在二维整数空间中,集合的每个元素是一个多元组。在之前的图像处理方法的输入与输出均为图像,而要与模式识别、人工智能等能够代表内涵的方法接口,需要一种中间方法。能够担此重任的就是形态学及相关方法。基于集合论的形态学方法是经常使用的。
(2)拓扑框架
在形态学中应用的两种拓扑分别为建立在闭集上的开关拓扑和定义在紧致集上的近视拓扑。近视拓扑学的优点是它与Hausdorff距离联系,在应用中适合于做形状比较计量。
(3)代数框架
代数框架一般用网格来描述。网格是一个带有次序关系的集合T,其中所有的元素对(或所有的有限系)都具有一个上限和一个下限。若整个元素系(有限的或无限的)具有一个最小的上界和一个最大的下界,则网格是完备的。特别的,一个完备的网格包含一个最小元素和一个最大元素。
本章主要研究疵点区域识别算法。针对坯布纹理图像的特点,研究了一种适合在非规则纹理图像中寻找目标区域的基于自适应门限的疵点区域分割方法;根据疵点特征类型及其区域识别的需要,提出了用矩形窗沿直线扫描,通过计算窗内斑点的总面积来确定是否保留直线上该点的窗线扫描方法,解决了预处理后图像中疵点信息断裂的难题。
更多相关的信息可以留意我们公司的网站
最专业的视觉检测专家
&武汉三维光之洋电气&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。当前位置:&>&&>&&>& > 正文
数字图像处理实习报告
点击次数:2137次|时间: 23:40|来源:新浪博客
一、实习的目的和意义
实习目的:本实习内容旨在让学生通过用VC等高级语言编写数字图像处理的一些基本算法程序,来巩固和掌握图像处理技术的基本技能,提高实际动手能力,并通过实际编程了解图像处理软件的实现的基本原理。为学生进一步学习数字摄影测量、遥感和地理信息系统等专业课程以及应用图像处理解决实际问题奠定基础。
二、实习原理和方法
(1)&&& Raw格式到BMP格式的转换:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Raw格式:Raw格式文件是按照数字图像组成的二维矩阵,将像素按行列号顺序存储在文件中。这种文件只含有图像像素数据,不含有信息头,因此,在读图像时,需要根据文件大小,计算图像所包含的行列号,或者需要事先知道图像大小(矩阵大小)。RAW文件按图像上行到下行、左列到右列顺序存储。
BMP格式:BMP文件数据区按图像上下行到上行、左列列到右列顺序存储到数据区。BMP文件由文件头、信息头、颜色表、数据区四个部分组成。
做Raw格式文件到BMP格式文件的转化,先要为BMP格式文件申请四部分的内存:文件头,位图信息头,颜色表,图象数据,然后根据输入值以及Raw文件信息,BMP格式文件信息计算出这几部分的值,赋给他们,写到BMP文件中去。
(2)&&& 灰度图象的线性拉伸:
&&& 灰度变化是点运算,将原图象的每个像素的灰度值改成线性变化之后的灰度即可。
灰度的线性变换就是指图像的中所有点的灰度按照线性灰度变换函数进行变换。灰度变换方程如下:
该方程为线性方程。式中参数 &为输入图像的像素的灰度值,参数为输出图像的灰度值。
设原图象的灰度范围为[a,b],变化之后的范围为[a&,b&],则:
&&&&&&&&& fA=(b&-a&)/(b-a)
&&&&&&&&& fB=-(b&-a&)/(b-a)*a+a&
如果算出来的值大于255,则让它等于255,小于0则让其等于0。
(3)&&& 局部处理(3*3高通滤波,3*3低通滤波):
局部处理在处理某一像素时,利用与该像素相邻的一组像素,经过某种变换得到处理后图像中某一点的像素值。目标像素的邻域一般是由像素组成的二维矩阵,该矩阵的大小为奇数,目标像素位于该矩阵的中央,即目标像素就是区域的中心像素。经过处理后,目标像素的值为经过特定算法计算后所得的结果。
实际上都是利用卷积来实现的,卷积往往用一个矩阵表示,将矩阵的中心对齐某个像素,矩阵中的值乘到相应的像素中去,然后将所有乘积加起来就得到中心像素的灰度值。边界像素不做处理,仍为原来的灰度值。求出的像素灰度值若超过[0~255],则向离其最近的属于该范围的像素值靠拢。
3*3低通滤波的算子见表1。
3*3高通滤波的算子见表2。
(4)&&&&&&&&& 图象几何处理(图象平移,图象缩放):
对于图像平移来说,若平移量是(tx,ty),像素在原图像中的坐标为(x0,y0),则变化后的坐标为(x1,y1),x1=x0+tx,y1=y0+ty。平移只需改变像素的灰度值,不必改变位图信息头和调色板内容。
对于图像缩放,假设放大因子为ratio,缩放的变换矩阵为:
&&&&& 图像信息头中新图像的宽度和高度都变为原来宽度和高度分别与水平垂直比例的乘积,图像大小变为新宽度(变为4的整数倍)与新高度的乘积。
(5)&&& 灰度图象中值滤波:
中值滤波也属于局部处理的一种,将窗口中的各个像素排序之后排序,取中值赋给模板中心的像素,所以窗口中个数一般是基数。
我用的中值滤波窗口是十字丝的9个数的窗口。
(6)&&& 灰度图象边缘检测:
&& 边缘检测有三种算子:Roberts,Prewit,Sobel。三种算子都是做一阶差分的,通过算子算出各个像素的梯度值,将水平梯度的绝对值和垂直梯度的绝对值相加,若此梯度值大于某个阈值,则将其灰度值赋为255,否则赋为0。
(7)&&& 图象旋转:
& &&&图像旋转一般是以图像中心为中心顺时针旋转,利用图像的四个角点求出图像旋转后的大小。
&&& 先计算以图像中心为原点坐标系下原图像四个角点的坐标值,按照旋转矩阵计算其旋转之后的坐标值,根据四个角点的新坐标值计算出最大宽度和高度作为新图像的宽度和高度值,按照计算值修改位图信息头,申请一块新内存,存储旋转后图像的灰度值。
旋转矩阵如下:
同样要求各个像素在原图像中的坐标,先将新图像的坐标系平移到图像中心,做逆时针旋转,然后再平移到屏幕左上角,然后将原图像对应坐标的值赋给新图像。
(8)&&& 图象二值化:
判断分析法:假定图像的灰度区间为[0,L-1],则选择一阈值T 将图像的像素分为两组。
为最大值所对应的T,就是所求判断分析法的分割阈值。
搜寻到阈值之后,灰度值小于阈值的像素赋0,其他的赋1,修改文件信息头,调色板,申请新内存。
(9)&&& 图象直方图:
统计各灰度值出现的频数,以及像素的总个数,用频数除以总个数作为频率,以灰度值作为横坐标,频率作为纵坐标绘图。
三、实习过程和步骤
首先要建立一个基于MFC的多文档工程,将视图基类改为滚动视图,以自己的学号命名。
我用的是书上给的CDib类,类里面有获取BMP宽度,高度的函数,有指向位图信息头的指针,指向图象数据的指针,因此我在文档类(Doc类)里定义了一个CDib类的对象,打开以及保存文件的时候利用这个对象去调用CDib里读取与存储文件的函数,并且可以利用这个对象的两个指针对打开的图象进行各种操作。
1.Raw格式到BMP格式的转换:
首先建立一个RawToBMP的对话框,在上面加上四个编辑框(一个输入打开文件的路径一个输入保存文件的路径,另两个),两个按钮,以及默认的确认,取消按钮。利用类向导插入此对话框类,并且为前两个编辑框定义CString的两个变量,用来存储打开与保存文件的路径。同时为两个浏览按钮添加消息响应函数,在消息函数里创建CFileDialog对象,利用此对象的函数将两个路径值赋给前两个编辑框的成员变量。再为OK键添加消息响应函数,分别定义 BMP格式文件前三部分数据变量,计算出各变量的值,并且利用一个CFile对象获取Raw图象的数据,利用另一个CFile对象将数据存储到所输入的路径的文件中去,CFile对象的Read函数会自动创建一个文件。
然后在菜单上新建一个菜单,为菜单添加消息响应函数,在其消息响应函数里创建RowToBMP对话框。这样点击菜单后就会弹出一个对话框,按确定键之后就可以读取Raw文件并且存储BMP文件,完成整个消息循环。
2.灰度图象的线性拉伸:
创建一个对话框来输入变化后的灰度值,为对话框的两个编辑框定义成员变量,在文档类中添加处理函数,按照对话框输入值计算出fA与fB,做一个循环,将0 到255的灰度值,计算出拉伸后的灰度值(超限情况特殊处理),存放在下标为此值的一个数组中,然后利用文档类的中定义的CDib类的成员变量 m_DIB,获得当前打开的图像指向图像数据部分的指针m_DIB.m_pBits,在数组中查出每个像素变化后的灰度值,并将此值赋给指针 m_pBits指向的内存。刷新视图。
然后在菜单中加上线性拉伸的菜单,为该菜单的ID添加消息响应函数,在该函数中创建对话框,并调用文档类线性拉伸的函数,将对话框的两个成员变量传给此函数。
3.局部处理:
在文档类里添加低通滤波和高通滤波的成员函数,在函数中使用m_DIB对象中指向图像数据部分的指针m_pBits,首先申请一个新内存,将原来图像的灰度值存储起来,然后定义9个BYTE类型的指针,利用双重嵌套循环,在循环中每次用这9个指针指向复制图像对应模板中的9个数,然后按照模板中的数值计算出中心像素的灰度值,判断是否超过范围,如果超过范围则做相应的处理,否则将此值直接赋给m_pBits中对应的中心像素。循环之后刷新视图。
添加局部处理的菜单,为菜单设置消息响应函数,在菜单消息响应函数中调用文档类的函数,完成对m_DIB的处理。
&&& 4.图像几何变换:
建立平移对话框,定义两个成员变量,分别存储输入的水平位移和垂直位移。
在文档类里添加平移函数,申请一块新内存复制原图像的信息,在函数中将
外层循环变量i视为纵坐标,内层循环变量j视为横坐标,通过双重循环,对每个像素,求出其在原图像中的坐标(i0,j0),将复制图像中的对应(i0,j0)的像素灰度值赋给m_DIB.m_pBits指针中的图像。如果在原图像中找不到该像素,置为背景色。刷新视图。
在菜单中添加图像平移菜单,并为该菜单添加消息响应函数,在此函数中创建平移对话框,调用文档类的平移函数,将对话框的成员变量传入该函数。
建立缩放对话框类,为此类定义两个成员变量,存储输入的水平缩放因子和垂直缩放因子。
再在文档类中添加缩放函数,利用m_DIB.m_pBMI(指向位图信息头的指针),修改位图信息头中的宽度,高度,图像大小。计算出新图像的大小,申请一块新内存存储新图像,同平移函数一样,计算出每个像素在原图像中的坐标,i0=i/PRatio,j0=j/VRatio,PRatio与VRatio 分别为水平缩放因子和垂直缩放因子。将原图像中对应坐标的灰度值赋给新内存,然后将m_DIB.m_pBits(指向图像数据的指针)指向新内存,刷新视图。
5.中值滤波:
在文档类中添加两个成员函数。一个用来把传入的指针里的内容排序,一个用来做中值滤波。也要申请一块新内存来复制原图像的信息,双重嵌套循环,边界像素不处理,对每个像素,使用一个大小为9个字节的数组来存放复制图像窗口中各像素值,然后将数组首地址传入排序的函数中,将中间的值赋给当前图像窗口中心的像素。排序函数我用的是快速排序法。
在菜单中添加中值滤波菜单项,为其添加消息响应函数,调用文档类的中值滤波函数。
6.边缘检测:
在文档类中定义三个函数,分别为Roberts,Prewit,Sobel算子处理函数,处理时,先申请新内存复制原来图像信息,边界像素不作处理,对每个像素值,求出其在复制图像中的梯度,判断,若梯度值大于150(这个是我自己定的),则将灰度值赋为255,否则置零。
菜单中添加边缘检测菜单,置属性为Pop&up,添加三个下一级菜单,分别为Roberts,Prewit,Sobel,各个菜单的消息响应函数中调用文档类中各自的处理函数。
7.图像旋转:
创建一个对话框输入旋转角度,在文档类中添加成员函数。
先将角度化为弧度值。
计算原图像四个角点的坐标,以及新图像四个角点的坐标。
根据新图像四个角点的坐标,取对角线上两个点横坐标差值较大值作为宽度,纵坐标差值较大值作为高度。
根据计算出来的高度和宽度修改文件信息头,并且申请内存存储新图像。
计算每点的像素在原来图像中的坐标从而获取其灰度值,写入新内存。
将m_DIB.m_pBits指向该新内存。刷新视图。
添加图像旋转菜单,在菜单响应函数中创建对话框,调用文档类中旋转函数,将对话框中获取的角度传给旋转函数。
8.图像二值化:
在文档类添加一个成员函数,根据传人的图像和阈值返回组间方差和组内方差的比值。
再添加一个成员函数,进行二值化。
在函数中:
计算新BMP文件的大小,申请一块新内存,存储新的整个BMP文件的信息,将位图信息头中biBitCount置为1,调色板数组只有两个两个元素,下标为0的三个灰度值都为0,下标为1的三个灰度值为255。
从最大灰度值到最小灰度值之间搜寻上述函数返回值最大的值,作为阈值。
对每个像素,若其原来灰度值小于阈值,赋1,否则赋0。
将m_DIB,m_pBits指向新内存的图像数据部分,m_DIB.m_pBMI指向位图信息头。
9.图像直方图:
为文档类添加一个int型指针成员变量m_pGray,在构造函数中将该指针赋空,在文档类中定义了一个函数,统计各个灰度值出现的频数,申请一个内存,存储在这个内存中,并将m_pGray指向它。
创建一个画直方图的对话框,添加Picture控件,在控件里调用文档类成员变量,画直方图。添加一个滚动条,用来确定阈值,为滚动条添加消息响应函数,按照滚动条的值进行二值化。
在菜单中添加直方图菜单,添加消息响应函数,在响应函数中创建直方图对话框对象。
最后,因为我开始做工程的时候没有把菜单设计好,做得有点乱,所以,我又在View里添加WM_CONTEXTMENU消息响应函数,在函数体内用CMenu类来实现弹出菜单。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
四、结果分析与评价
(1)Raw格式到BMP格式的转换:效果见图1。
老师说在转化的时候后面用一个循环会降低效率,但是实际上只要宽度是4的整数倍,后面的循环就不会做了。所以这个算法效率我觉得还行吧。
(2)线性变化:输入线性变化范围10~20,效果见图2。
用了线性查找表之后,这个算法的效率应该会高很多,但是我的算法里是线性表从0~255都有变化之后的值,实际上,如果图片的灰度范围小一些的话,做了很多无用的计算,而且前面已经搜寻过原图像的最大最小灰度值了,所以线性表的生成循环可以只从最小灰度做到最大灰度。另外,我设计的算法里,如果最大值和最小值输反了的话,程序会自动交换他们的值,做这个可能就会多算一些东西了。
(3)低通滤波:效果见图3。
取的是8邻域内的平均值,效果不是很好。
高通滤波:效果见图4。
基本上我觉得边缘还是有突出了吧。
中值滤波:效果见图5。
这个中值滤波的效果我还是比较满意的,因为排序所以要调用其他函数,我用了快速排序,而且用的是9个数的十字丝窗口,所以速度要比25个数的窗口快一些。平滑的效果出来还可以。
(4)边缘检测:
Roberts算子:效果见图6。
Prewit算子:效果见图7。
Sobel算子:效果见图8。
由于Prewit算子和Sobel算子都用了8个数去做,所以效果要好一些,相比之下,Sobel算子对这幅图又要效果好些,应该是对4邻域赋予了更大权的缘故。但是后两种算法计算量也要大一些。
(5)图像平移:效果见图9。
这个图像平移量比较大,所以被裁切的也显得不真实了。主要是因为我的图像大小和坐标都没有变化,所以只在原来的图像坐标范围内显示平移后的图像,实际上,我既可以改变图像的大小,并且为了节省计算,可以让循环变量i和j从一个新的值开始做计算,前面的全都赋背景色。
图像缩放:水平比例0.4,垂直比例0.5,效果见图10。
在此基础上旋转:效果见图11。
这几种算法主要的计算量都在for循环内,所以要想优化算法的话,必须简化循环里的计算。不过我的想法差不多跟书上的差不多,还没有什么优化。也许,这种优化的算法需要看很多别人做的好程序才能慢慢自己学会吧。
(6)二值化(判断分析法):效果见图12。
实际上,我用直方图看的最佳阈值应该在100多左右,而我做的程序阈值好像偏小一些,所以效果不太好,我计算组间方差和组内方差的时候调用了一个函数专门求阈值,可能这里的计算还是有一点问题。而且在我的函数里,要256次调用这个函数,又因为计算机是按字节处理数据的,因此写图像数据的时候要用每8个写到一个数组中,然后通过计算得到字节类型的值,这些都使得我的算法效率比较低,最后一个问题,我觉得如果使用位运算会快一些,但是前面的问题还没有想到比较好的解决方法。
(7)直方图:效果见图13。
这个图像255的像素太多,如果我没算错的话,量化应该不是很好吧。
五、实习总结与体会
这次实习学到最大的东西,是自己总算有MFC编程的概念了,虽然自己VC++考试的分数还不错,但是里面的很多东西,不通过自己的编程时绝对不能真正理解。比如说封装性,这次用CDib的方便,很好地利用了类的封装性。另外,比如MFC是基于消息响应机制的,这就决定了,要利用鼠标或者菜单响应函数去实现功能,而用c语言编写程序的时候,完全是按主函数的线程来的。
另外,我也学会了调试的真正含义。以前都只知道那几个按键是做什么用的,调试的真正目的,是根据自己的算法来检验程序计算的各个值是否符合,从而可以很快速方便地查到自己的错误。
自学也是很重要的一方面。实际上,在现在来说,用MSDN也不是很难的事了,我们不应该被英文打到,而且现在,随着对一些专有名词熟悉了之后,看MSDN也容易一些了,万一不懂的函数,也可以利用网络查到很多函数功能用法的解释。
刚开始的时候做的是位图的读取和显示,实在是不知从哪里做起,所以就照着实习书上敲了前面的部分,但是慢慢地也看懂了代码的意思。所以后来的基本上都是自己做的了,但是算法还是基本上和书上差不多。不过自己编的时候还是有很多细节的部分没有注意到,比如说,强制数据类型转换,我自己编的时候没有注意这个问题,结果出了很多错,有些事由于函数调用引起的,有些是由于不等号两边数据的匹配问题,还有的是由于指针的移动,直到这个时候,才真正明白实习书上程序为什么那么多强制类型转换,虽然书上很多东西不是尽善尽美,但是对于我这种刚开始学会编程的人还是有很多可以学习的地方的。
如老师所说,算法的效率是很重要的。要提高算法的效率,一个是要简化计算(不得不说,这需要数学基础),另外一个就是要避免许多重复的计算。在参考书上的程序里,很多时候,为了避免这种重复的计算(在循环中表现尤其明显),会把某些数当常数算出来,只要后来加上这个常数就可以,这样,效率高很多。
另外,对许多出错的情况,我的程序里也没有做好。比如,如果打开的不是8位图像,我的程序不会提示错误,正常结束,而可能做错,所以,这也是我应该向别人程序学习的地方。
最后一个,自己菜单的布局也是很乱的。要从一开始就布局好。

我要回帖

更多关于 jay roberts 的文章

 

随机推荐