懒人推动社会的发展
之前一帖嫌弃自己一个接一个点,数种子太慢的朋友们
现在就给你们一个自动数种子的工具
首先,先介绍原理。
1、将彩色图转换为灰度图像,再将灰度图像转换为计算机便于识别的二值图(即黑白图)。
转换前
转换后
2、然后经过一顿我也看不懂的图像处理骚操作,大致是填充小洞、分割、形状规则化之类的。
得到下面的结果
3、最后,计算中间每个连续域的总数量。
计算的结果为50粒,因为2粒种子挤在一起,计算机不好识别,存在误差,下面是误差对比:
真实结果为52粒,比计算结果多2粒,所以,把种子摊开是关键。
下面是计算程序:程序用Matlab运行,复制进去按下回车就行了。
RGB = imread('E:\588.jpg');%这个是读取图片的语句,单引号里面是图片的存放位置,建议放在纯英文路径上
I = rgb2gray(RGB);
se = strel('disk',5,0);
I2 = imbothat(I,se); % 底帽变换,去除不均匀背景
figure,imshow(I2)
I3 = imadjust(I2); % 这一步可有可无,调节灰度对比度
% 灰度图像二值化,全局阈值分割最大化类间方差
level = graythresh(I3);
BW = im2bw(I3,level);
figure,imshow(BW)
% 孔洞填充和形态学开运算
BW1 = imfill(BW,'holes');
figure,imshow(BW1)
se1 = strel('square',5);
BW2 = imopen(BW1,se1);
figure,imshow(BW2)
% 形态学腐蚀运算,部分目标物有粘连现象,去除粘连
se2 = strel('disk',1,0);
BW3 = imerode(BW2,se2);
figure,imshow(BW3)
% 形态学开运算,去除影响计数的干扰颗粒
se3 = strel('disk',1,0);
BW4 = imopen(BW3,se3);
figure,imshow(BW4)
[L,N] = bwlabel(BW4); % N即为目标个数
N
最后的最后,感谢来自matlab论坛 tdcq127朋友的程序,个人做了一点点调整
原帖地址:http://www.ilovematlab.cn/thread-272277-1-1.html
若存在一些未考虑全面的地方,请各位花友指正,并欢迎相关专业的专业人士改进出更适合数种子的程序。 |