图像处理实例一:统计图片中的硬币个数

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);

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值