前面提到了空间域变换,接下来开始频率域变换,然后各种滤波,最后还了解了彩色图像和压缩。进入最后的部分。
引入:为什么叫形态学呢?形态学是生物学的定义,用于处理动物和植物的形状和结构。
数学形态学mathematical morphology,MM
集合运算
映像 {w|w=-b, b∈B} ,翻转变换
平移 {c|c=a+z, a∈A},平移
子弹只要擦着你的皮,你就伤了,这就算hit了!
击中 hit,是结构元素(小)只要和大的块求交不为空就行
不击中 miss,是结构元素(小)只要和大的块求交为空
加号是膨胀,减号是腐蚀,好理解吧
膨胀 dilate,加长或变粗的操作,由一个称为结构元素的集合来控制。结构元素必须指明原点
A⊕B = { z | (B)z ∩ A ≠ ∅ },表示图像A用结构元素B膨胀
一句话概括,只要击中了,就以这个点为中心,套上结构元素。
可用来补全残缺文字。(本来断了线,一变粗就连起来了)
结构元素的分解,提高计算效率。(数电知识,异或的结合律)
A⊕B = A⊕(B1⊕B2) = A⊕B1⊕B2
matlab里有专门分解结构元素的函数
腐蚀 erode,收缩或细化的作用
A⊙B = {z|(B)z ∩ AC ≠ ∅ } 图像A用结构元素B腐蚀,是和A补集的运算
一句话概括:必须是包含关系,才可以把这个结构元素的中心的值给要了。
公式太难打了,直接上图…
开运算(把你们给分开):平滑对象轮廓,断开狭窄的连接,取消细小的突出部分。先腐蚀,再膨胀。
闭运算(把你们给连起来):将狭窄的缺口连接起来形成细长的弯口,填充比结构小的孔洞。先膨胀,再腐蚀。
开运算像中学老师,看见一点恋爱苗头就要扼杀在摇篮里,然后让两个人自己涨自己的。(主要目的是分开,所以叫“开运算”。好,就这么记吧)
闭运算像媒婆/丘比特,人家还犹犹豫豫呢就要把两个人连起来,然后把周围的干扰项踢开。
正经点的理解方式:
开运算,是圆在图形的内部各种平移,最后取圆的部分作为结果。
闭运算:是圆在图形外部各种平移,取圆没有移动到的地方。
开运算 去除指纹噪声,先去噪,再膨胀连接(上面噪音太多了,先把米掏干净再蒸)
击中击不中变换,hitmiss 需要结构元素组B =(B1, B2)
用来识别特定形状
给个例题加深理解,感觉题目出的很好!
Step1:确定结构元素
注意:B1和B2应该是互斥的,并集 正好是个正方形。
Step2:求B1求腐蚀
所以只有左边和下方的图形能够被包含,显示。
Step3:对AC求B2的腐蚀
取反了。看B2这个框能框住谁?这次左侧和右上的可以。
Step4:求交集。
然后我们就找到想要的正方形的位置了!
matlab工具箱里还有很多东西,应用如 细化指纹、对图像物体进行骨骼化。
基本概念:
N4( p ), ND( p ), N8( p )
4邻接,8邻接;
4连接,8连接;
一张图搞定这些概念
第一行分别是4、D、8连接。D是指对角相邻元素
Diagonal adjoining
第二行:左图:p和q满足4、 8邻接。右图:p和q只满足8邻接。因为4邻接只能是上下左右
第三行:左图是4、 8邻接,右图是只满足8邻接(45度了)
。。。这一节看起来蛮有来扫雷连连看十滴水的感觉呢。。。
matlab中有标记连通分量的函数,分为4邻接和8邻接两种。
bwlabel(f, conn), f是图像(二值矩阵),conn是连接方式,4或8
重构变换涉及两幅图像和一个结构元素(原谅我没看懂这些概念)
标记marker,变换的初始状态
掩膜mask,变换的限制区域
结构元素,决定连接性,通常为ones(3,1)
用图片例子方便理解。掩膜mask,相当于最大可能给的范围
标记是初始,种子。
种子依靠结构元素的连接性,每次连接延伸一下。然后不停延伸,但一定不能超过掩膜的范围。
应用
需要一个结构元素b
膨胀是在结构元素确定的邻域块中,选择原图像值f与结构元素的和的最大值。
腐蚀是在结构元素确定的邻域块中,选择原图像值f与结构元素的差的最小值。
膨胀 f⊕b,取最大值
(f⊕b)(x,y) = max{f(x-x’,y-y’) + b(x’,y’) | (x’,y’)∈Db}
当b(x,y)是平坦的,都为0时,(f⊕b)(x,y) = max{f(x-x’,y-y’)|(x’,y’)∈Db}
腐蚀 f⊙b,取最小值
(f⊙b)(x,y) = min{f(x+x’,y+y’) - b(x’,y’) | (x’,y’)∈Db}
重点应用:开运算/闭运算
过程
1扫描一个单行的灰度值。
2重复扫描完所有的行
顶帽、低帽
开运算可以用来补偿不均匀的亮度背景。比如一幅图片中,背景亮度不是一样的,这边亮那边暗,可能会使某些部分被错误弄成物体。
根据图像进行解释,从左到右,从上到下分别为abcde
a是原图
b是傻白甜,直接用阈值处理的图像。大的给1,小的给0,无情地把右下角那几颗香喷喷的米粒给无视了(说明我黑到没被认出来,不是我的原因,是背景的错!)
c对原图进行开运算。联想开运算的定义,是去掉局部较亮的部分。所以得到一个去掉比较亮的大米粒的背景板(这个背景板和原图的基本相同)
d原图减去开运算,把粉底揭掉,看看真面目
e对其进行二值化处理
颗粒分析,取不同大小的结构元素
其实跟顶帽的思想也差不多。都是减去背景,突出细节
引入:把图像细分成各个区域和组成对象
难点:分割程度,分的太粗或太细都不好
思路:单色图像分割,基于图像亮度值的
不连续性:亮度突变(如边缘)
相似性:基于事先定义的规则
点
线检测
基于四个线检测模版:
依次用四个模版处理图像得到g1、g2、g3、g4;
寻找各gi中超过阈值T的像素点集合。
为什么用4个模版?为了比较看谁的值最大,就最可能是哪条线?!
边缘检测
LoG边缘检测器(Laplacian of a Gaussian)
这么怪的公式会考?(不会的吧。滑稽)
零交叉检测器,类似于LoG,但使用指定滤波函数,而非高斯
Canny边缘检测器,重点
比前几种好。基于边缘梯度方向的非极大值抑制;双阈值的滞后阈值处理。
引入:因为噪声、不均匀照明,使算法得到的边缘不连续,难以得到完整的边缘特性,所以需要把不完整的边缘组装成完整的边缘。Hough Transform
把(x,y)转换成(ρ,θ)
对于点x(xi, yi),经过其的所有直线对应(ρ, θ)平面内的一条正弦直线。但我好奇k怎么知道的呢?或许是把ρ计算出来当做已知吧,毕竟ρ用距离公式就能算啊…
全局阈值处理,首先选一个T,然后分成两组,计算两组的像素平均亮度值μ1和μ2。
计算一个新阈值T=1/2(μ1+μ2),循环(统计均值,计算)。直到连续迭代中T的差比预先指定的参数T0小为止。
or ,利用人眼,挑个中位数
比如在pdf图像中,使文字更加清晰,提高对比度。
局部阈值处理
为什么呢?因为背景照明可能不均匀。
顶帽运算,属于局部阈值处理。顶帽运算是原图像与“开运算”的结果的差
图像f0是f的形态学开运算,常数T0是对f0应用函数graythresh后的结果。
把R分成R1、R2、R3,…,Rn
要求是:所有的Ri,并集为R;每个Ri自身是连接区域;彼此交集为空;P(R i)=TRUE;
P(Ri∪Rj)=FALSE,对于任何邻接区域
第四第五条的意思是,一个区域内像素点必须满足某种谓词P的性质。
区域生长,根据预先定义的生长准则,把像素或子区域集合成较大区域。首先找“种子”,然后找邻居(指定的灰度级或颜色)。有点像掩膜标记的思路
区域分离与合并
先分离
然后合并任何满足P(Ri∪Rj)=TRUE的区域
不能再进行合并时,停止。
使用距离变换的分水岭分割二值图像
通常用背景像素距离前景像素的最近距离来代表相应背景像素的灰度。
D=bwdist(f)
L=watershed(f)
abcdefghi,挨个分析
1原图g
2补,反一下
3 使用了bwdist,让背景的1变零,然后黑色的地方,根据离背景1最近距离,来变成不同的正数
4补,反一下
5分水岭算法
6,图w,将L==0的那些纯黑边界找出来(目前看来,不够连续,离散)
7 原始图像g和图w的叠加
8 黑色线叠加在原始图像上,g&~w
9 xor(g,w),异或
基于梯度的分水岭分割灰度图像
使用梯度作为地形数据
2 梯度图像,越亮的地方,变化越明显
4 平滑处理,ones(3,3)
基于标记区域的分水岭分割灰度图像
选择内部(前景)标记区域和外部(背景)标记区域,指导分水岭分割。
嗯,感觉自己越来越不想写了。。。加油,最后一章,写完我也就算是复习了一遍啦!
引入,刚刚咱们完成了分割操作,接下来要对各区域进行形式化地表达和描述
对区域进行表示,涉及到两个基本选择:
1.形状特性焦点,用区域外部特征(区域的边界)表示区域
2.反射率特性焦点,用区域内部特征(组成区域的像素)表示区域
确定表示方案后,需要对区域进行描述
Freeman链码
链码通过一个指定长度和方向的直线段的连接序列来表示边界。
一般采用4或8个方向,正右方为0,然后逆时针转。
循环差分链码:用相邻链码的差代替链码
(2)10103322 ——>33133030
3,3,1,3,3,0,3,0(想象成向左转向右转)
多边形逼近,有点像老祖宗的求圆周率方法
基本思想:用最少的多边形线段,获取边界形状的本质。
两种方法:点合成法、点分裂法
problem:顶点一般不对应于边界的拐点(如拐角)。因为新的线段知道超过误差的阈值才开始。
最小周长多边形(MPP)的多边形近似
关键词:凸角(黑点)、凹角(白点)
1获取区域边界后,确定边界的凹顶点(白)和凸顶点(黑)。黑顶点就是边界的点,白顶点是边相邻但没有被填充的正方形的对角顶点。
2连接所有的凸黑顶点构成初始多边形,删除该多边形之外的白顶点。边界和内部白顶点保留!!!
3用剩余的黑白顶点,连接构造多边形,删除所有凹(顺时针转,内角不是90°而是270°)的黑顶点,重复此步只到不再发生变换。
标记,用一维函数表达边界,降维
最简单的方法是用极坐标思想
problem:函数过分依赖于旋转和比例的变化
改进
旋转:
MAT方法:R是一个区域,B为R的边界,对于R内的点p,找p在B上最近的点,如果p有多于一个最近的邻点,则属于R的中轴(骨架)。
简单描述子,边界的长度,连接方式(4/8),边界的直径、长短轴、基本矩形、偏心率等
形状数,具有最小整数值的差分链码串。形状数的阶,定义为形状数中数字的个数。
生成形状数的步骤:
旋转边界坐标到长轴方向;从左上角开始,按顺时针方向写出链码串;求链码串的差分串;移位差分串,获得结果。
傅里叶描述符 ,优点是使用复数作为描述符,对于旋转、平移、放缩等操作和起始点的选取不十分敏感。
统计矩,跟极坐标差不多,还是降维,旋转到坐标系
区域描述符,matlab提供了很多纹理描述符
还有基于频域的方法,纹理的频谱度量。。。(俺真的搞不懂)
不变矩,有些二维不变矩,对于平移、缩放、镜像、旋转不敏感。