本文介绍了使用matlab软件对图像进行基本处理。包括读取目标图像文件,将RGB图像转换为灰度图,填充像素,腐蚀像素,实现计数等问题。
实验中需要用到硬币识别,查了很多资料其实也不是特别理想,只能说相对来说效果还行。
以及对图片进行降噪操作。没有使用开运算和闭运算,只使用了腐蚀运算,效果不好的话可能需要调一下结构元素的大小。
改进了一下灰度处理的判断方法。
%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]);%中值滤波
二值化的方法,用的OTSU确定最佳阈值,这样二值化会少一些噪点。
%3.使用OTSU进行二值化处理
T=graythresh(Image);%OTSU计算最佳阈值
BW=im2bw(Image,T);%灰度图变二值图
填充二值化图像不完整的地方
%4.填充洞
BW= imfill(BW,'holes');
盘状结构元素,进行腐蚀运算
%5.建立结构元素并腐蚀运算
SE=strel('disk',5);
result1=imerode(BW,SE);
%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);