机器视觉(硬币分割与边缘提取)

硬币分割与边缘提取

本次的图像硬币分割是在Matlab平台上采用基于阈值的图像分割法实现。总体步骤分为中值滤波去噪、图像二值化、开操作、闭操作、连通区域提取、BoundingBox提取标记六步完成。
可以看到原始图像中含有一定的噪声,因此采用中值滤波算法进行降噪处理。经过代码的调试与实验结果对比,本次采用的是6*6窗口的中值滤波算法,可以很好的看到图片去噪后的效果。首先是获取原始图片的路径,然后对原始图片进行降噪处理,降噪处理就是去除图片中多余的白点噪声,为下一步的二值化处理进行先前准备工作。
在这里插入图片描述
原始图像
在这里插入图片描述
滤波后图像


通过上步降噪过程的完成,接下来就是对图像进行二值化处理。一开始采用的是用ostu方法获取默认二值化阈值,进行二值化操作,得到的效果如下图所示:
在这里插入图片描述
二值化图像

我们可以看到图片的左上角出现大块面积的噪声区域,因此得到的效果非常不理想。所以接下看我采用了另一种通过自定义调节的阈值二值化图像方法对图像重新二值化操作。具体过程是:首先通过设定一个初始化阈值,然后构造一个与图片等大的零矩阵,对每个像素点进行加255的操作使其变为白色图片,最后通过for循环将原图各点像素与阈值对比,并在对应的矩阵中使小于阈值的像素点变为黑色。最终看待的效果比较理想。运行结果如下图所示:
在这里插入图片描述
二值化图像
在得到较好的二值化图像后,接下来在对图像进行开、闭操作。开运算相当于先腐蚀运算,再膨胀运算(效果就是上去把细微连在一起的两块目标分开)开运算的效果图如下图所示:

在这里插入图片描述
(1)开运算能够除去孤立的小点,毛刺和小桥,而总的位置和形状不便。
(2)开运算是一个基于几何运算的滤波器。
(3)结构元素大小的不同将导致滤波效果的不同。
(4)不同的结构元素的选择导致了不同的分割,即提取出不同的特征。
我们看到图像经过开运算后有些硬币区域分散的较开,因此要对图像进一步作闭运算操作,使得硬币分散区域能够较好的连载在一起。闭运算相当于先膨胀运算,再腐蚀运算(效果是将两个细微连接的图块封闭在一起)
闭运算的效果图如下图所示:

在这里插入图片描述
(1)闭运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变。
(2)闭运算是通过填充图像的凹角来滤波图像的。
(3)结构元素大小的不同将导致滤波效果的不同。
(4)不同结构元素的选择导致了不同的分割。
经过上面几步的完成,接下来就是对图片连通区域的提出同时将图像用rgb颜色标记不同区域。所谓的连通区域标记是指对二值图像中白色像色而言,即值为1的像素进行标记,而黑色像素看作是背景颜色。这步主要是采用bwlabel函数实现。这个函数的作用是用来找这个二值图像中的连通区域的,对于不同的符合条件的连通区域(4连通,8连通)分别用不同的标号加以区别,结果保存在矩阵当中,而num里保存的是输入图像中连通区域的总数。运行后的结果如下图所示:
在这里插入图片描述
现在我们确定了哪些是硬币的区域,哪些是背景等等。因此,我们再进行BoundingBox提取并标记出硬币所在位置。BoundingBox是用来度量图像区域属性的函数。同时我们再用“红色矩形线框”标记连通区域并用数字记录硬币的个数。运行结果如下图所示,较好地标记出了硬币所在位置,实现了硬币从图片中分割出来的效果。
在这里插入图片描述


完整代码

代码如下:

clc;
clear;
close all;
fprintf('=======中值滤波=====\n');
img=imread('E:\pictures\coin.jpg'); 
figure;imshow(img);title('原始图像');
 % 使用[3,3]的窗口
img_med2 = medfilt2(img, [6,6]);
figure;imshow(img_med2);title('6*6中值滤波');
subplot(2,2,1),imshow(img_med2),title('滤波后图像')
[m,n] = size(img_med2);       
value = 129.01;              %设定阈值
bw = zeros(m,n)+255;         %与img_med2等大的全0矩阵,+255就是把所有像素值都设置成白色
for i = 2:m-1                      
    for j = 2:n-1        
        if img_med2(i,j)<value     %for循环判断每个像素点
            bw(i,j) = 0;           %在对应的矩阵中,小于设定阈值的变成黑色
        end
    end
end
imshow(img_med2);
figure;
imshow(bw);
se = strel('disk', 4);
Io = imopen(bw, se);
Ie = imerode(Io, se);
openbw = imreconstruct(Ie, bw);
Ic = imclose(openbw, se);
 subplot(2, 3, 2); imshow(Io, []); title('开操作图像');
subplot(2, 3, 3); imshow(Ic, []); title('闭操作图像');
 %获取连通区域,并进行显示
% L = bwlabel(openbw,8);
[L,num] = bwlabel(Ic,8);
RGB = label2rgb(L);
subplot(2,2,4),imshow(RGB),title('用rgb颜色标记不同区域')
%统计标注连通域
%使用外接矩形框选连通域,并使用形心确定连通域位置
[l,m] = bwlabel(Ic);
status=regionprops(l,'BoundingBox');
centroid = regionprops(l,'Centroid');
imshow(img);hold on;
for i=1:m
    rectangle('position',status(i).BoundingBox,'edgecolor','r');
    text(centroid(i,1).Centroid(1,1)-15,centroid(i,1).Centroid(1,2)-15, num2str(i),'Color', 'r') 
end 


  • 0
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值