针对目前谷物人工计数和光电计数方法存在的不足 , 提出了一种基于 Matlab 图像识别和处理技术的谷物计数方法 , 并用实例验证了其可靠性。该方法减轻了操作者劳动强度 , 弥补了人视觉的不足之处 , 提高了效率及准确率 , 为今后进一步研究奠定了必要的理论与实践基础 , 对完善“精细农业 ”具有重要意义 。
1.图像的灰度化处理
通过双循环对图像进行灰度化处理。通过对彩色通道的加权求和,将彩色图像转换为灰度图像
2.去除噪声处理
通过均值滤波去除图像中的噪声,提高后续处理的准确性
3.裁剪中心区域和直方图分析
对图像进行裁剪,选择中心区域,然后显示该区域和其直方图,
4.二值化
通过迭代法确定一个阈值,实现图像的二值化处理
5.谷物颗粒计数的实现
通过连通性分析计算谷物颗粒的数量
二值化后的图像像素只有 0 和 1 两个值 ,分别表示背景和目标。由于一个谷物颗粒的图像像素是连续的 ,在二值图像中表现为连通性 , 因此可以利用计算连通图的数量来求出谷物颗粒数量。在 M atlab 中利用 bw label函数求出连通图 ,并给出连通图的数量。
源代码:
clear
clc
Img=imread('1.jpg');%读彩色图像
figure
imshow(Img);title('原图像')%显示原始图像
[n m a]=size(Img);%判断图像的大小
Img_Gray=zeros(n,m);
for x=1:n%通过双循环对图像进行灰度化处理
for y=1:m
Img_Gray(x,y)=0.3*Img(x,y,1)+0.59*Img(x,y,2)+0.11*Img(x,y,3);%实现灰度化
end
end
J=filter2(fspecial('average',3),uint8(Img_Gray))/255; %去除噪声
figure
imshow(J);title('去除噪声的图像') %显示去除噪声图像
[e1,e2]=size(J);
Im=imcrop(J,[e2/2-200,e1/2-200,400,400]);
figure
imhist(Im)
title('中心区域直方图');
[xa,ya]=size(Im);
b=double(Im);
zd=double(max(Im)) ;
zx=double(min(Im)) ;
T=double((zd+zx))/2;
count=double(0);
while 1
count=count+1;
S0=0.0; n0=0.0;
S1=0.0; n1=0.0;
for i=1:xa
for j=1:ya
if double(Im(i,j))>=T
S1=S1+double(Im(i,j));
n1=n1+1;
else
S0=S0+double(Im(i,j));
n0=n0+1;
end
end
end
T0=S0/n0;
T1=S1/n1;
if abs(T-((T0+T1)/2))<0.1
break;
else
T=(T0+T1)/2;
end
end
K=find(J<T);
J(K)=0;
K=find(J>=T);
J(K)=255;
figure
imshow(J),title(' 图像二值化 ');%显示二值化图像
[I,n]=bwlabel(J,4);%通过连通性,计算谷物的颗粒数
disp(['数量=' num2str(n)])
最后:
如果你想要进一步了解更多的相关知识,可以关注下面公众号联系~会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!