Matlab函数imfill简介
函数功能: 该函数用于填充图像区域和“空洞”。 语法格式: BW2 = imfill(BW) 这种格式将一张二值图像显示在屏幕上, 允许用户使用鼠标在图像上点几个点, 这几个点围成的区域即要填充的区域。要以这种交互方式操作, BW必须是一个二维的图像。用户可以通过按Backspace键或者Delete键来取消之前选择的区域;通过shift+鼠标左键单击或者鼠标右键单击或双击可以确定选择区域。 [BW2,locations] = imfill(BW) 这种方式, 将返回用户的取样点索引值。注意这里索引值不是选取样点的坐标。 BW2 = imfill(BW,locations) 这种格式允许用户编程时指定选取样点的索引。locations是个多维数组时, 数组每一行指定一个区域。 BW2 = imfill(BW,‘holes’) 填充二值图像中的空洞区域。 如, 黑色的背景上有个白色的圆圈。 则这个圆圈内区域将被填充。 I2 = imfill(I) 这种调用格式将填充灰度图像中所有的空洞区域。 BW2 = imfill(BW,locations,conn) 程序示例
close all; clear; clc;
BW4 = im2bw(imread('coins.png'));
BW5 = imfill(BW4,'holes');
subplot(121), imshow(BW4), title('源图像二值化')
subplot(122), imshow(BW5), title('填充后的图像')
腐蚀和膨胀
膨胀(dilate) 膨胀就是求局部最大值的操作。这样就会使图像中的高亮区域逐渐增长。 腐蚀(erode) 腐蚀和膨胀是相反的操作,腐蚀是求局部最小值的操作。腐蚀操作会使图像中的高亮区逐渐减小。 就是把图像中的小的白色点腐蚀掉?
strel函数
主要用来构建形态学运算中的结构元素,使用的语法为strel(shape,parameters)。shape为形状参数,即设置什么样的结构元素;parameters为控制形状参数大小方向的参数。 strel函数是用来生成指定的结构元素,采用直接输入的方法,太过麻烦,采用strel()函数则能够快速地构建我们想要的的结构元素。
strel函数的用法如该链接所示
bwlabel函数
[L,num] = bwlabel(BW,n)这里num返回的就是BW中连通区域的个数。 通俗的说,这个函数的作用是用来找这个二值图像中的连通区域的,对于不同的符合条件的连通区域(4连通,8连通)分别用不同的标号加以区别,结果保存在L这个矩阵里,而num里保存的是输入图像中连通区域的总数。 举例说明: BW = 1 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 1 0 0 0 0 0
按4连通计算,方形的区域,和翻转的L形区域,有用是对角连接,不属于连通,所以分开标记,连通区域个数为3,就是有3个不同的连接区域。
L = bwlabel(BW,4)
结果如下:
L =
1 1 1 0 0 0 0 0
1 1 1 0 2 2 0 0
1 1 1 0 2 2 0 0
1 1 1 0 0 0 3 0
1 1 1 0 0 0 3 0
1 1 1 0 0 0 3 0
1 1 1 0 0 3 3 0
1 1 1 0 0 0 0 0
而8连通标记,它们是连通的:
[L, num] = bwlabel(BW,8)
L =
1 1 1 0 0 0 0 0
1 1 1 0 2 2 0 0
1 1 1 0 2 2 0 0
1 1 1 0 0 0 2 0
1 1 1 0 0 0 2 0
1 1 1 0 0 0 2 0
1 1 1 0 0 2 2 0
1 1 1 0 0 0 0 0
这里 num =2
源代码及效果图
rgb = imread('E:\新建文件夹 (2)\1.jpg');
bw_image = rgb2gray(rgb); %转换成灰度图
% imtool(bw_image)
bw_image1 = bw_image > 100; %让像素大于100的全部变成黑色
subplot(141);imshow(bw_image1);
%% 填充银币黑点
bw_image2 = imfill(bw_image1,'holes');
subplot(142);imshow(bw_image2);
%% 去除噪声
SE = strel('disk',5); %生成一个5*5的原型矩阵
bw_image3 = imerode(bw_image2,SE); %用这个矩阵进行扫描,扫描到的遮盖的区域全部腐蚀,即变成黑色
subplot(143);imshow(bw_image3);
%% 数硬币
[L, num] = bwlabel(bw_image3);
disp(num);
|