基于Matlab实现硬币识别

本文介绍了使用matlab软件对图像进行基本处理。包括读取目标图像文件,将RGB图像转换为灰度图,填充像素,腐蚀像素,实现计数等问题。

实验中需要用到硬币识别,查了很多资料其实也不是特别理想,只能说相对来说效果还行。

以及对图片进行降噪操作。没有使用开运算和闭运算,只使用了腐蚀运算,效果不好的话可能需要调一下结构元素的大小。

一、对图像进行灰度处理

改进了一下灰度处理的判断方法。

基于Matlab实现硬币识别_第1张图片

%1.灰度处理
[m,n,l] = size(handles.img4);%检测图片的规格
if l == 3
    handles.img4 = rgb2gray(handles.img4);    %如果为彩色图 则转化为灰度图
else
    handles.img4=handles.img4;
end

二、降噪处理

使用madjust进行灰度调整 

medfilt2用于进行中值滤波处理

%2.降噪处理
Image=handles.img4;
Image= imadjust(Image,stretchlim(Image),[0 1]);
Image=medfilt2(Image,[5 5]);%中值滤波

基于Matlab实现硬币识别_第2张图片

三、二值化处理

二值化的方法,用的OTSU确定最佳阈值,这样二值化会少一些噪点。

%3.使用OTSU进行二值化处理
T=graythresh(Image);%OTSU计算最佳阈值
BW=im2bw(Image,T);%灰度图变二值图

基于Matlab实现硬币识别_第3张图片

四、填充洞

填充二值化图像不完整的地方

%4.填充洞
BW= imfill(BW,'holes');

五、创建结构元素并进行腐蚀运算

盘状结构元素,进行腐蚀运算

%5.建立结构元素并腐蚀运算
SE=strel('disk',5);
result1=imerode(BW,SE);

基于Matlab实现硬币识别_第4张图片

六、检测二值图像中连通域的个数 

%6.检测二值图像中连通域的个数
[L, NUM] = bwlabel(result1, 4) 
%[L, NUM] = bwlabel(BW, N)
% BW 为输入二值化图像;
% N 可取值为4或8表示连接四连通或八连通区域;
% NUM 为找到的连通区域数目;
% L为输出图像矩阵,其元素值为整数,背景被标记为0,第一个连通区域被标记为1,第二个连通区域被标记为2,
%1,2,3即为第1,2,3个连通区域的标记
axes(handles.window4); %在窗口3中展示
imshow(result1);
S=sprintf('检测到的硬币个数为:%d',NUM);msgbox(S);%弹窗显示运行结果

完整代码

function getcoin_Callback(hObject, eventdata, handles)
%1.灰度处理
[m,n,l] = size(handles.img4);%检测图片的规格
if l == 3
    handles.img4 = rgb2gray(handles.img4);    %如果为彩色图 则转化为灰度图
else
    handles.img4=handles.img4;
end
%2.降噪处理
Image=handles.img4;
Image= imadjust(Image,stretchlim(Image),[0 1]);
Image=medfilt2(Image,[5 5]);%中值滤波
figure(1),imshow(Image);title('中值滤波');

%3.使用OTSU进行二值化处理
T=graythresh(Image);%OTSU计算最佳阈值
BW=im2bw(Image,T);%灰度图变二值图
figure(2),imshow(BW);title('二值化');

%4.填充洞
BW= imfill(BW,'holes');
%5.建立结构元素并腐蚀运算
SE=strel('disk',5);
result1=imerode(BW,SE);
figure(3),imshow(result1);title('腐蚀运算');
%6.检测二值图像中连通域的个数
[L, NUM] = bwlabel(result1, 4) 
%[L, NUM] = bwlabel(BW, N)
% BW 为输入二值化图像;
% N 可取值为4或8表示连接四连通或八连通区域;
% NUM 为找到的连通区域数目;
% L为输出图像矩阵,其元素值为整数,背景被标记为0,第一个连通区域被标记为1,第二个连通区域被标记为2,
%1,2,3即为第1,2,3个连通区域的标记

axes(handles.window4); %在窗口3中展示
imshow(result1);
S=sprintf('检测到的硬币个数为:%d',NUM);msgbox(S);%弹窗显示运行结果
guidata(hObject, handles);

基于Matlab实现硬币识别_第5张图片

基于Matlab实现硬币识别_第6张图片

基于Matlab实现硬币识别_第7张图片

 

 

你可能感兴趣的:(matlab实验,matlab,开发语言)