IPT函数strel运用各种形状和大小构造结构元素,其基本语法为
se = strel(shape, parameters)
其中,shape是指定希望形状的字符串,而parameters是指定形状信息(如其大小)的一列参数。
除了可简化常用结构元素形状的产生之外,函数strel还有一个种重要的属性,即分解的形式来产生结构元素。函数imdilate自动地使用分解信息来加快膨胀处理。执行膨胀运算的速度大约比分解形式的速度快三倍
$$ 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)
$$ 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为闭运算后的图像
$$ 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为应用击中或击不中变换后的结果
当击中或击不中结构元素较小时,计算击中或击不中变换的较快方法是使用查找表(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');
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可实现这一目的。该方法会识别并删除端点。
若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显示了检测到的点的图像