编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN
数学形态学是一种应用于图像和模式识别领域的新方法,利用这种方法进行图像分析的基本步骤为:
·提出所要描述的物体几何结构模式,即提取物体的几何特征
·根据该模式选择相应的结构元素,结构元素应该简单而对模式具有最强的表现力
·用选定的结构元对图像进行击中与否HMT变换,可以得到显著的突出物体特性信息图像
·经过形态变换后的图像突出需要的信息,方便提取信息
数学形态学的核心运算是击中与否变换HMT,在定义了HMT及其基本运算膨胀Dilation和腐蚀Erosion后,再从积分几何和体视学移植一些概念和理论,根据图像分析的各种要求,构造出统一的、相同的或变化很小的结构元素进行各种形态变换。在形态算法设计中,结构元的选择十分重要,其形状、尺寸的选择是能否有效提取信息的关键。
二值图像中所有的像素点值只有0和1两种值,在形态学中,把0和1对应于关闭和打开,关闭对应该像素点的背景,而打开对应该像素点的前景,用这种方法很容易识别图像的结构特征。
1. 数学形态学的基本运算:
膨胀和腐蚀是两个形态学基本的操作,膨胀过程是在图像中在对象边界添加像素点,而腐蚀是逆过程。对应的添加和移除像素点数依赖于处理图像结构元素矩阵的大小和形式。
1)结构元素矩阵Strel:
膨胀和腐蚀操作本质上是用结构元素映射输入图像。二维或平面结构元素是一个包含0和1元素的数组,结构元素的中心像素称为原点,它是结构元素参与形态学运算的参考点,通常为用户期望的像素。获取结构元素原点的坐标值的代码为:
origin=floor((size(nhood)+1)/2)
这里,nhood是结构元素领域,结构元素为MATLAB对象。
膨胀和腐蚀操作的结构元素对象称Strel对象,膨胀和腐蚀操作过程就是用Strel对象去探测图像并分析图像结构的过程。MATLAB中使用strel函数创建Strel对象。格式为:
SE=strel(shape, parameters)
创建由指定形状shape的结构元素,支持的形状有平面的结构元素和非平面的结构元素两类。
支持的平面的结构元素有:
arbitrary |
diamond |
disk |
line |
octagon |
pair |
periodicline |
rectangle |
square |
支持的非平面的结构元素有:
arbitrary |
ball |
不同的shape有不同的参数parameters。
2)操作结构元素的函数:
由于Strel对象不同于矩阵,一般MATLAB函数无法直接操作,为此提供了一些专门的函数。
函数名 |
说明 |
函数名 |
说明 |
getheight |
获取结构元素的高度 |
isflat |
平面的结构元素返回真 |
getneighbors |
获取结构元素的邻域和高度 |
reflect |
反转结构元素 |
getnhood |
获取结构元素的邻域 |
translate |
偏移结构元素 |
getsequence |
获取分解的结构元素顺序 |
|
|
3)膨胀运算:
A被B膨胀的过程是B首先做关于原点的映射,然后平移x,与A至少有一个非零公共元素。
MATLAB使用imdilate函数实现膨胀操作。调用格式:
IM2=imdilate(IM, SE) ---- 膨胀灰度、二值或压缩二值图像IM。参数SE为由strel函数返回的结构元素对象或结构元素对象数组。若IM为二值图像并且结构元素为平面的,则函数执行的是二值膨胀,否则执行灰度膨胀。若SE为结构元素对象数组,函数执行输入图像的连续多重膨胀。
IM2=imdilate(IM, NHOOD) ---- NHOOD定义结构元素邻域0和1的矩阵,等价于imdilate(IN, strel(NHOOD)),由指令floor((size(NHOOD)+1)/2)决定邻域的中心元素
IM2=imdilate(IM, SE, PACKOPT) ---- 参数PACKOPT可以取值ispacked或notpacked,当值为ispacked时,表示IM为bwpack函数产生的压缩二值图像,对应PADOPT参数为same;而缺省值notpacked表示常规数组。
IM2=imdilate(... , PADOPT) ---- 指定输出图像的大小,参数PADOPT有same和full两种值,缺省值same表示输入图像与输出图像大小一致;full表示计算全部膨胀。
4)腐蚀运算:
腐蚀是一种消除边界点,使边界点向内部收缩的过程,可以用来消除小且无意义的物体。A被B腐蚀的结果为所有使B被x平移后包含于A的点x的集合。MATLAB使用imerode函数实现腐蚀操作,调用格式:
IM2=imerode(IM, SE)
IM2=imerode(IM, NHOOD)
IM2=imerode(IM, SE, PACKOPT, M)
IM2=imerode(... , PADOPT)
5)开运算和闭运算:
开运算一般能平滑图像的轮廓,消弱狭窄的部分,去掉细的突出;闭运算也平滑图像的轮廓,它一般熔合窄的缺口和细长的弯口,去掉小洞,填补轮廓上的缝隙。A被B开运算就是A被B腐蚀后的结果再被B膨胀;A被B闭运算就是A被B膨胀后的结果再被B腐蚀。
⑴ imopen函数:实现开运算
IM2=imopen(IM, SE) ---- 用结构元素SE实现灰度图像或二值图像IM的形态开运算,参数SE可以为单个的结构元素,也可以为结构元素对象数组。
IM2=imopen(IM, NHOOD) ---- 用结构元素strel(NHOOD)执行开运算
⑵ imclose函数:实现闭运算
IM2=imclose(IM, SE)
IM2=imclose(IM, NHOOD)
6)击中与击不中:
形态学上击中与击不中变换是形状检测的基本工具。bwhitmiss函数进行二值图像的击中与击不中操作。调用格式为:
BW2=bwhitmiss(BW1, SE1, SE2) ---- 执行由结构元素SE1和SE2的击中击不中操作。击中与击不中操作保存匹配SE1形状而不匹配SE2形状邻域的像素点。等价于操作imerode(BW1, SE1) & imerode(~BW1, SE2)。
BW2=bwhitmiss(BW1, INTERVAL) ---- 执行定义为一定间隔数组的击中与击不中操作。INTERVAL数组的元素值为1、0或-1,1值元素组成SE1范围,-1值组成SE2范围,0值将被忽略。等价于bwhitmiss(BW1, INTERVAL==1,INTERVAL==-1)。
7)二值图像形态学处理函数bwmorph:
BW2=bwmorph(BW1, operation) ---- 应用指定的形态学运算处理二值图像
BW2=bwmorph(BW1, operation, n) ---- 应用运算n次,n可以无穷大,直到图像不再变换
operation对应的运算:
参数值 |
说明 |
bothat |
闭运算,然后减去原图 |
bridge |
连接运算,将原来不相连的像素点相连,如将101连成111 |
clean |
清除孤立的亮点,中间为1而周边为0的点 |
close |
执行二值闭运算 |
diag |
用对角线填充来消除背景的不连接 |
dilate |
用结构元素ones(3)来膨胀 |
erode |
用结构元素ones(3)来腐蚀 |
fill |
填充孤立的像素点,中间为0而周边为1 |
hbreak |
断开H型连接的像素 |
majority |
若像素点8个邻域中有5个以上像素值为1,则该像素值为1,否则为0 |
open |
开运算 |
remove |
去掉内部像素点 |
shrink |
n=Inf,将对象收缩成点。它消除像素,使没有孔的像素缩成1点,使有孔的对象缩成外层边缘,在每个孔之间缩成一个相连的环。保持欧拉数 |
skel |
n=Inf,消除对象边缘上的点,但不使对象分裂,剩下的像素构成图像的骨架,保持欧拉数 |
spur |
去掉小短枝像素 |
thicken |
n=Inf,在对象的外部不断增加像素,但要保证所增加的像素不会导致原来不连接的对象称为8连接,保持欧拉数 |
thin |
n=Inf,将对象细化 |
tophat |
用原图减去开运算后的图像 |
8)其他膨胀和腐蚀函数:
函数 |
说明 |
imbothat |
闭运算,然后减去原图 |
imtophat |
用原图减去开运算后的图像 |
2. 形态学的基本应用:
当处理二值图像时,形态学的主要应用是提取表示和描述图像形状的有用成分。
1)边缘提取:
设B是一个合适的结构元素,首先令A被B腐蚀,然后求集合A和它的腐蚀的差。
函数bwperim函数提取二值图像的边缘。调用格式:
BW2=bwperim(BW1) ---- 从输入图像BW1中返回只包含对象边缘像素点的图像
BW2=bwperim(BW1, CONN)
参数CONN有:
维数 |
参数值 |
说明 |
二维 |
4 |
4邻域 |
|
8 |
8邻域 |
三维 |
6 |
6邻域 |
|
18 |
18邻域 |
|
26 |
26邻域 |
高维 |
计算值 |
conndef(ndims(BW), 'minimal'),此函数获取缺省的连接域矩阵,其中的ndims函数获取图像BW的维数 |
2)连通对象标注:
函数bwlabel和bwlabeln进行连通对象标注。bwlabel主要用于二维二值图像中各个分离部分进行标注,bwlabeln用于多维。调用格式:
L=bwlabel(BW, n) ---- 返回和BW相同大小的数组L,L中包含了连通对象的标注,参数n为4或8,分别对应4邻域和8邻域,缺省值为8。
[L, num]=bwlabel(Bw, n) ---- 返回连通数num
L中的元素为大于等于0的整数,标记为0的像素为背景像素,值为1的像素为一个对象,值为2的像素对应于第2个对象,以此类推。
3)对象选择:
函数bwselect从图像中提取指定对象。调用格式:
BW2=bwselect(BW1, c, r, n) ---- 返回一个包含像素(r, c)对象的二值图像,r和c为标量或等长的向量;如r和c是向量,返回图像BW2包含像素点(r(k), c(k))的对象。参数n为4或8,缺省值为8,4对应4邻域,8对应8邻域。
BW2=bwselect(BW1, n) ---- 用交互的方式来选择对象,单击鼠标左键选择一个像素点(r, c)),按下退格键或删除键则移除先前选择的一点,按下shift键同时点击鼠标、点击鼠标右键或双击鼠标都会选择最后一点,按下回车键表示结束选择。
[BW2, idx]=bwselect(...) ---- 返回选择对象点数的线性索引
BW2=bwselect(x, y, BW1, xi, yi, n) ---- 为图像BW1用非默认的空间坐标系统x和y,xi和yi指定这个坐标系中特定点的坐标
[x, y, BW2, idx, xi, yi]=bwselect(...) ---- 返回x和y坐标中的属性XData和YData,输出图像BW2,选择对象所有像素点的线性索引idx和xi、yi所指定的空间坐标轴。
若bwselect函数没有返回的参数,则把返回的图像自动显示在一个新的窗口对象上。
4)二值图像面积提取:
⑴ bwarea函数:
bwarea函数提取二值图像的面积,就是前景图像的大小,也可以简单的认为是图像中值为1的像素点的数目。函数调用格式:
total=bwarea(BW)
估算二值图像BW的选择对象的面积,返回值为一个标量,概略地看作值为1的像素点数,但由于不同像素点的权值不同,也不能完全相等,例如水平线和对角线上的像素点的权值是不一样的。具体的算法为:
·有0个1像素的方式,area=0
·有1个1像素的方式,area=1/4
·有2个相邻1像素的方式,area=1/2
·有2个对角1像素的方式,area=3/4
·有3个1像素的方式,area=7/8
·有4个1像素的方式,area=1
每个像素点都有4个不同的2x2的邻域,意味着一个像素点的面积不是简单上面算法所定义的值,而是分别为4个不同邻域的和值。
⑵ regionprops函数:获得实际像素点数
STATE=regionprops(L, properties)
对标注图像L中的每一个标注对象计算一组测度。参数properties可以是Area、EquivDiameter、MajorAxisLength、BoundingBox、EulerNumber、MinorAxisLength、CentroidExtent、Orientation、ConvexAreaExtrena、PixelIdxList、ConvexHull、FilledArea、PixelList、ConvexImage、FilledImage、Solidity、Eccentricity、Image、SubarrayIdx。若参数为all,则计算所有的测度;缺省为basic,只计算Area、Centroid、BoundingBox。计算实际像素点数使用:
area=regionprops(BW, 'area')
5)二值图像的欧拉数:
几何理论中,欧拉数是图像的一种拓扑度量。欧拉数等于图像中所有对象的总数减去这些对象中的空洞的数目。bweuler函数计算图像的欧拉数,调用格式:
eul=bweuler(BW, n) ---- 计算图像BW的欧拉数,n为采取的邻域方法
6)移除对象:
bwareaopen函数从对象中移除小对象。调用格式:
BW2=bwareaopen(BW, P)
BW2=bwareaopen(BW, P, CONN)
从二值图像中移除所有比P小的连通对象,参数CONN对应邻域方法,缺省值为8。
bwareaopen函数的算法基于几步:
·决定连通对象:L=bwlabeln(BW, CONN)
·计算每个连通对象的面积:S=regionprops(L, 'Area')
·移除小于P的对象:bw2=ismember(L, find([S.Area]>=P))
7)区域填充:
bwfill函数实现图像的区域填充,灰度填充使用imfill。它对背景图像进行操作。格式:
BW2=bwfill(BW1, c, r, n) ---- 对图像BW1进行区域填充,(c,r)为起始坐标,n为邻域,4或8
BW2=bwfill(BW1, n) ---- 用交互式方式选择对象
[BW2, idx]=bwfill(...) ---- 返回填充所有像素点的线性索引
BW2=bwfill(x, y, BW1, xi, yi, n) ---- 用矢量x和y为BW1设非默认空间坐标系,xi和yi指定填充起点,为标量或等长矢量
[x, y, BW2, idx, xi, yi]=bwfill(...) ---- 返回的XData和YData分别存在x和y中,idx为所有像素点的索引,xi和yi为填充的起始点
BW2=bwfill(BW1, 'holes', n) ---- 填充二值图像BW1中的孔洞
[BW2, idx]=bwfill(BW1, 'holes', n) ---- 返回所有填充像素点的线性索引
若没有返回值,则bwfill函数自动在新创建的窗口中显示图像。
8)距离变换:
bwdist函数实现二值图像的距离变换。调用格式:
D=bwdist(BW) ---- 对二值图像BW计算欧几里得几何学距离变换
[D, L]=bwdist(BW) ---- L返回标注数组,其中包含BW最近非零元素的线性索引
[D, L]=bwdist(BW, METHOD) ----METHOD指定计算距离的变换
对BW中每个像素,距离变换指定像素点与BW最近非零像素的距离,缺省使用欧几里得距离。METHOD参数为:
参数 |
说明 |
chessboard |
二维中,棋盘距离为max(|x2-x1|,|y2-y1|) |
cityblock |
二维中,cityblock距离为|x2-x1|+|y2-y1| |
euclidean |
二维中,欧几里得距离为sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)) |
quasi-euclidean |
二维中,类欧几里得距离为|x2-x1|+(sqrt(2)-1)*|y2-y1| 当|x2-x1|>|y2-y1|时 |
3. 查找表操作:
一些二值图像形态学操作,如果采用查找表Lookup Table的方法,能够很容易处理。查找表是一个向量,它把一个像素邻域点的所有可能组合存储在表中每个元素上,方便后面的运算。
1)创建查找表:
用makelut函数可以创建2x2和3x3邻域查找表。对于2x2邻域,像素邻域有16种可能的组合,因此2x2邻域的查找表是一个16元素的向量;对于3x3邻域,存在512种组合,因此查找表为512元素的向量。makelut函数的调用格式为:
lut=makelut(fun, n) ---- 返回用于applylut函数的查找表,n为邻域大小,fun为包含函数名或内联函数对象的字符串
lut=makelut(fun, n, P1, P2) ---- fun的附加参数P1、P2等
2)基于查找表的图像处理:
applylut函数用于基于查找表的二值图像处理。调用格式:
A=applylut(BW, LUT)
其中的LUT为makelut函数返回的查找表。
3)2x2邻域处理:
每个邻域有4个像素,每个像素有2个可能值,所有交换的总次数为16。applylut函数将二值图像与矩阵[8 2;4 1]进行卷积,生成索引矩阵。卷积结果值的范围是[0,15]整数值。applylut使用卷积中与输入二值图像矩阵相同大小的中心部分,将每个值都加1,范围变成[1,16]。然后,将索引矩阵中每个位置上的值用LUT中索引值所指向的值置换,构造出A。
4)3x3邻域处理:
3x3矩阵总交换次数为512,而二值图像的卷积矩阵为[256 32 4;128 16 2;64 8 1]。
4. 灰度形态学:
前面的一些处理都是针对二值图像的,也可以推广到灰度图像处理,有些函数是复用的。
还有其他一些函数:
1)conndef函数:
conndef函数创建连通矩阵。调用格式:
CONN=conndef(NUM_DIMS, TYPE)
返回NUM_DIMS维的连通矩阵,参量TYPE包括:
参数值 |
说明 |
minimal |
对于N维的情形,定义一个关于N-1维表面的邻域 |
maximal |
定义一个包含中心元素邻居的邻域,ones(repmat(3, 1, NUM_DIMS)) |
2)imclearborder函数:
imclearborder函数抑制连结图像边界的亮结构。调用格式:
IM2=imclearborder(IM) ---- 抑制比周围和连结图像边界亮的结构,IM可为灰度或二值图像
IM2=imclearborder(IM, CONN) ---- 指定CONN的连结形式
3)极大值极小值变换:
⑴ imhmin函数:H极小值变换
I2=imhmin(I, h) ---- 抑制灰度图像中所有的极小值,h为一个常量
I2=imhmin(I, h, CONN) ---- CONN指定连结形式
⑵ imhmax函数:H极大值变换,用法与imhmin类似
⑶ imextendedmax函数:扩展极大值变换,用法与imhmin类似
⑷ imextendedmin函数:扩展极小值变换,用法与imhmin类似
⑸ imimposemin函数:强制赋予极小值
I2=imimposemin(I, BW) ---- 用形态学重构法修改灰度图像I,以致只有区域极小值为非零
BW为和I大小相同的二值图像
4)图像极大值极小值区域:
imregionalmax函数和imregionalmin函数获取极大值和极小值区域。调用格式:
BW=imregionalmax(I) ---- 发现I的极大值区域
BW=imregionalmax(I, CONN) ---- CONN定义连结形式
函数在I中定义极大值区域,对应在BW中把像素点设为1,其他设为0。