9.2.3 函数strel
-
IPT函数strel运用各种形状和大小构造结构元素,其基本语法为
se = strel(shape, parameters)
其中,shape是指定希望形状的字符串,而parameters是指定形状信息(如其大小)的一列参数。
除了可简化常用结构元素形状的产生之外,函数strel还有一个种重要的属性,即分解的形式来产生结构元素。函数imdilate自动地使用分解信息来加快膨胀处理。执行膨胀运算的速度大约比分解形式的速度快三倍
9.2.4 腐蚀
- 腐蚀“收缩”或“细化”二值图像中的对象。像在膨胀中一样,收缩的方式和程度由一个结构元素控制。腐蚀的数学定义与膨胀相似,A被B腐蚀记为:\(\boldsymbol{A} \Theta \boldsymbol{B}\)定义为:
$$ A \ominus B=\left\{z |(B)_{z} \cap A^{c} \neq \varnothing\right\} $$
A = imread('c:\图像\腐蚀样本.tif');se = strel('disk',10);
A2 = imerode(A,se);
figure,imshow(A)
figure,imshow(A2)
se = strel('disk',5);
A3 = imerode(A,se);
figure,imshow(A3)
A4 = imerode(A,strel('disk',20));
figure,imshow(A4)
-
图像1为原始图像
图像2是用半径为10的圆盘腐蚀后的图像
图像3是用半径为5的圆盘腐蚀后的图像
图像4是用半径为20的圆盘腐蚀后的图像
9.3 膨胀与腐蚀的组合
9.3.1 开运算和闭运算
- A被B的形态学开运算可以记做\(A \circ B\),这种运算是A被B腐蚀后再用B来膨胀腐蚀结果:
$$ A \circ B=(A \ominus B) \oplus B $$ 开运算的另一个公式为: $$ A \circ B=\cup\left\{(B)_{z} |(B)_{z} \subseteq A\right\} $$
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200626101951567.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMTAxNjM3,size_16,color_FFFFFF,t_70)-
开运算和闭运算再工具箱中用函数imopen和imclose实现。这两个函数的语法形式为:
C = imopen(A, B)和C = imclose(A, B)
其中,A是一幅二值图像,而B是一个元素值为0和1的矩阵,该矩阵指定了结构元素。strel对象SE可以用来代替B。
f = imread('c:\图像\开运算闭运算样本.tif'); se = strel('square',20); fo = imopen(f, se); figure,imshow(f) figure,imshow(fo) fc = imclose(f, se); foc = imclose(fo, se); figure,imshow(foc) fc = imclose(f, se); figure,imshow(fc)
图像1为原图像
图像2为开运算后的图像
图像3为闭运算后的图像
图像4是经过图像2闭运算的结果
f = imread(‘c:\图像\指纹.tif’);
se = strel(‘square’,3);
fo = imopen(f,se);
figure,imshow(f)
figure,imshow(fo)
foc = imclose(fo,se);
figure,imshow(foc)
fc = imclose(f, se);
figure,imshow(fc)
图像1为原图像
图像2为开运算后的图像
图像3是经过图像2闭运算的结果
图像4为闭运算后的图像
9.3.2 击中或击不中变换
- A被B击中或击不中定义为\(A \otimes B\),其中,B是结构元素对B=(B1,B2),而不是单个元素。击中或击不中变换由这两个结构元素定义为:
$$ A \otimes B=\left(A \ominus B_{1}\right) \cap\left(A^{c} \ominus B_{2}\right) $$
+ 击中或击不中变换在IPT中用函数bwhitmiss实现,该函数的语法为:**C = bwhitmiss(A,B1,B2)**
其中,C为结果,A为输入图像,B1和B2为刚讨论过的结构元素。
B1 = strel([0 0 0; 0 1 1; 0 1 0]);
B2 = strel([1 1 1; 1 0 0; 1 0 0]);
f = imread('c:\图像\击中或击不中样本.tif');
g = bwhitmiss(f,B1,B2);
figure,imshow(f)
figure,imshow(g)
图像1为原图像
图像2为应用击中或击不中变换后的结果
9.3.3 使用查找表
-
当击中或击不中结构元素较小时,计算击中或击不中变换的较快方法是使用查找表(LUT)。这种方法是预先计算出每个可能邻域形状的像素值,然后把这些值存储到一个表中,以备以后使用。
-
大脸猫:
lut = makelut(@conwaylaws, 3); bw1 = [0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0; 0 0 0 1 0 0 1 0 0 0; 0 0 0 1 1 1 1 0 0 0; 0 0 1 0 0 0 0 1 0 0; 0 0 1 0 0 0 0 1 0 0; 0 0 1 0 0 0 0 1 0 0; 0 0 0 1 1 1 1 0 0 0; 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0; ]; subplot(2, 2, 1), imshow(bw1), title('1'); bw2 = applylut(bw1, lut); subplot(2, 2, 2), imshow(bw2), title('2'); bw3 = applylut(bw2, lut); subplot(2, 2, 3), imshow(bw3), title('3'); bw4 = applylut(bw3, lut); subplot(2, 2, 4), imshow(bw4), title('4');
9.3.4 函数bwmorph
-
IPT函数bwmorph可基于膨胀,腐蚀和查找表操作的组合实现许多有用的操作,该函数的调用语法为:
g = bwmorph(f,operation,n)
其中,f是一幅输入二值图像,operation是一个指定期望操作的字符串,n是一个用于指定将被重复的操作次数的正整数。输入参量n是可选的,因此可以忽略,省略时操作只执行一次。表9.3描述了函数bwmorph的有效运算集合。
f = imread('c:\图像\指纹.tif');
se = strel('square',3);
fo = imopen(f,se);
foc = imclose(fo,se);
figure,imshow(foc)
g1 = bwmorph(foc,'thin',1);
g2 = bwmorph(foc,'thin',2);
figure,imshow(g1)
figure,imshow(g2)
ginf = bwmorph(foc,'thin',Inf);
imshow(ginf)
figure,imshow(g2)
figure,imshow(ginf)
图像1为原图像
图像2为细化一次后的指纹图像
图像3为细化两次后的图像
图像4为细化到稳定状态的图像
骨骼化和细化经常会产生无关的短“毛刺”或寄生成分。清除(或去除)这些“毛刺”的过程称为修剪。函数endpoints可实现这一目的。该方法会识别并删除端点。
第十章 图像分割
10.1 点,线和边缘检测
10.1.1 点检测
-
若T已经给出,则如下命令可用实现刚才讨论的点检测方法:
g = abs(imfilter(double(f),w)) >= T;
其中,f是输入图像,w是一个合适的点检测掩模(如图10.1所示掩模),g是结果图像。函数imfilter会将其输出转化为输入的类,若输入是uint8类,且abs操作不接受整数数据,则我们可以在滤波操作中使用double(f)来防止过早的截断。若输出图像g是logical类图像,则它的值是0和1。若未给出T值,则其值通常会基于滤波结果来选择,这种情况下,前面的命令串分成了三个基本步骤
(1)计算已滤波的图像,即abs(imfiter(double(f),w));
(2)使用来自己滤波的图像的数据找到T的值
(3)将已滤波的图像与T做比较。
-
点检测实例:
w = [-1 -1 -1; -1 8 -1; -1 -1 -1]; f = imread('c:\图像\点检测样本.tif'); g = abs(imfilter(double(f),w)); T = max(g(:)); g = g >= T; figure,imshow(f) figure,imshow(g)
图像1为原图像(东北象限的暗灰色区域中几乎看不见的黑点)
图像2显示了检测到的点的图像