利用图像处理的额方法统计种子的个数
根据种子的特点,可以用的方法有:面积,周长。还有基于这两种方法的其他方案。
1、利用面积计算
clear all;close all;clc;
img=imread('种子.png');
figure;imshow(img);
img_R=img(:,:,1);%取红色通道分量分析
%%%基于面积做统计个数,计算整个二值图中的全部白色像素的个数,除以单个种子所占据的面积,即可得到大概个数
%%单个种子的面积可根据二值图中不是连连在一起的区域估算
figure;imhist(img_R);%观察直方图发现像素集中在20-150左右,取50-90计算面积,这里可以随意取,只要在范围内
img_R_bw=img_R<90&img_R>50;%根据直方图选取灰度值在50-90的区域进行面积计算
figure;imshow(img_R_bw);
img_R_bw_open=bwareaopen(img_R_bw,120);%删除小于120的区域,
figure;imshow(img_R_bw_open);
[area_label,num_label]=bwlabel(img_R_bw_open);%标记
% figure;imshow(area_label,[]);
Re_area=regionprops(area_label,'Area');%求连通区域的面积
%%%下面计算单个种子的像素面积
%通过观察图发现有的地方是多个连在一起的,将其忽略,最大的区域忽略,总共(num_label)各连通区域还剩下n个,将n个面积相加求均值。
Re_area=cell2mat(struct2cell(Re_area));%数据转化,将struct变成double
Re_m=length(Re_area);%求长度
all_sum=0;%总数
cout=0;%面积在120到200的个数
%%计算单个独立面积的个数和总和
for i=1:1:Re_m
if Re_area(1,i)>100&&Re_area(1,i)<250
all_sum=Re_area(1,i)+all_sum;
cout=cout+1;
end
end
if cout==0%没有单个独立的种子,需要重新设定参数
sigle_area=1;
else
sigle_are=all_sum/cout;%每个种子平均面积
end
Re_sum=sum(Re_area);%总面积
count_seed=round(Re_sum/sigle_are);%总面积除以单个面积求得大概的个数
fprintf('种子个数为%d\n',count_seed);
2、利用周长计算
clear all;close all;clc;
img=imread('种子.png');
figure;imshow(img);
img_R=img(:,:,1);%取红色通道分量分析
figure;imshow(img_R);
%%利用种子周长统计个数,通过观察发现种子的周长大概在40左右
img_edge=edge(img_R,'canny');%利用canny算子提取边缘
figure;imshow(img_edge);
img_edge_skel=bwmorph(img_edge,'skel',Inf);%利用形态学函数提取边缘
figure;imshow(img_edge_skel);
img_R_bw_open=bwareaopen(img_edge_skel,10);%删除小于120的区域,
figure;imshow(img_R_bw_open);
Re_sum=sum(sum(img_R_bw_open));%总周长
sigle_z=40;
count_seed=round(Re_sum/sigle_z);%总周长除以单个周长求得大概的个数
fprintf('利用区域条件方法统计的种子个数为%d\n',count_seed);
此外还有一些改进的方法,总体来收精度都不是很高。
链接:添加链接描述