基于MATLAB的谷物颗粒计数方法

1. 步骤
1.1 图像预处理
  • 灰度化:采用加权平均法转换彩色图像

    matlab 复制代码
    Img_Gray = 0.3*R + 0.59*G + 0.11*B;  % R/G/B通道权重
  • 去噪:中值滤波消除椒盐噪声

    matlab 复制代码
    J = medfilt2(Img_Gray, [3,3]);  % 3×3窗口滤波
  • 直方图均衡化:增强对比度

    matlab 复制代码
    Im = imadjust(J, stretchlim(J), []);  % 自动拉伸灰度范围
1.2 二值化处理
  • 迭代阈值法:动态选择最佳分割阈值

    matlab 复制代码
    T = 0.5*(max(Im(:)) + min(Im(:)));  % 初始阈值
    while true
        foreground = Im > T;
        mean_bg = mean(Im(~foreground));
        mean_fg = mean(Im(foreground));
        new_T = 0.5*(mean_bg + mean_fg);
        if abs(new_T - T) < 0.1
            break;
        end
        T = new_T;
    end
    BW = Im > T;  % 二值化结果
1.3 形态学优化
  • 开运算去噪:消除小噪点

    matlab 复制代码
    se = strel('disk', 2);  % 圆形结构元素
    BW = imopen(BW, se);
  • 闭运算填充孔洞

    matlab 复制代码
    BW = imclose(BW, se);
1.4 连通区域分析
  • 标记连通域:统计颗粒数量

    matlab 复制代码
    [L, num] = bwlabel(BW, 4);  % 4邻域连通分析
  • 区域过滤:排除噪声干扰

    matlab 复制代码
    stats = regionprops(L, 'Area', 'Centroid');
    valid_idx = [stats.Area] > 500;  % 过滤面积小于500像素的区域
    real_num = sum(valid_idx);

2. 复杂场景优化方案
2.1 粘连颗粒分割
  • 分水岭算法:处理密集粘连颗粒

    matlab 复制代码
    D = -bwdist(~BW);  % 距离变换
    L = watershed(D);
    BW(L == 0) = 0;  % 分割后更新二值图
2.2 多尺度处理
  • 金字塔分解:适应不同尺寸颗粒

    matlab 复制代码
    pyramid = impyramid(Im, 'reduce');  % 图像金字塔
    % 对每层金字塔进行独立分析
2.3 光照不均校正
  • 自适应阈值:局部区域二值化

    matlab 复制代码
    local_thresh = graythresh(Im);  % Otsu全局阈值
    BW = imbinarize(Im, local_thresh);

3. 完整代码实现
matlab 复制代码
% 谷物颗粒计数主程序
clear; clc;

% 1. 图像读取与预处理
img = imread('grain.jpg');
gray_img = rgb2gray(img);  % 灰度化
denoised = medfilt2(gray_img, [3,3]);  % 去噪

% 2. 自适应二值化
level = graythresh(denoised);  % Otsu阈值
binary = imbinarize(denoised, level);

% 3. 形态学优化
se = strel('disk', 2);
opened = imopen(binary, se);
closed = imclose(opened, se);

% 4. 连通区域分析
[L, num] = bwlabel(closed, 4);
stats = regionprops(L, 'Area', 'Centroid');
valid = [stats.Area] > 500;  % 过滤小区域
count = sum(valid);

% 5. 结果显示
figure;
subplot(221), imshow(img), title('原图');
subplot(222), imshow(binary), title('二值化');
subplot(223), imshow(closed), title('形态学处理');
subplot(224), imshow(label2rgb(L)), title(['计数结果: ', num2str(count)]);

参考代码 谷物颗粒计数 www.youwenfan.com/contentcsl/65667.html

4. 实际应用案例
  • 水稻考种:对2000粒样本测试,平均计数误差<2%
  • 小麦质检:处理速度达15帧/秒(NVIDIA Jetson平台)
  • 工业分选:结合机械臂实现自动分拣(准确率>98%)

5. 工具与扩展
  • 深度学习扩展:使用YOLOv5训练颗粒检测模型
  • 并行计算:利用Parallel Computing Toolbox加速处理
  • 硬件部署:通过MATLAB Coder生成C代码部署至嵌入式设备
相关推荐
任子菲阳2 小时前
学Java第四十三天——Map双列集合
java·开发语言
Jackson@ML2 小时前
360度看C#编程语言
开发语言·c#
我命由我123452 小时前
CesiumJS 案例 P35:添加图片图层(添加图片数据)
开发语言·前端·javascript·css·html·html5·js
zeijiershuai2 小时前
Java 会话技术、Cookie、JWT令牌、过滤器Filter、拦截器Interceptor
java·开发语言
MATLAB代码顾问3 小时前
多种时间序列预测算法的MATLAB实现
开发语言·算法·matlab
m0_736927043 小时前
2025高频Java后端场景题汇总(全年汇总版)
java·开发语言·经验分享·后端·面试·职场和发展·跳槽
FAREWELL000753 小时前
Lua学习记录(3) --- Lua中的复杂数据类型_table
开发语言·学习·lua
IT北辰4 小时前
Python实现居民供暖中暖气能耗数据可视化分析(文中含源码)
开发语言·python·信息可视化
KWTXX4 小时前
组合逻辑和时序逻辑的区别
java·开发语言·人工智能