当前位置: 首页 > news >正文

基于HSV和RGB颜色空间的自然场景下草地黄花背景分割检测和计数

一、引言

在农业、生态监测、智能花卉识别等场景中,花朵的自动计数是一项基础且重要的任务。传统人工计数效率低、易出错,而基于计算机视觉的方法可以实现快速、准确、非接触式的自动统计。本文基于 MATLAB 平台,采用HSV(或RGB) 颜色空间阈值分割 + 形态学优化 + 连通域分析的方法,实现黄色花朵的精准分割与自动计数,代码完整可直接运行。

二、基本原理

整个黄花检测与计数流程遵循图像分割→区域优化→目标统计的经典视觉处理思路,核心原理如下:

  1. 颜色特征分割黄色花朵在图像中具有明显区别于背景(绿叶、土壤、阴影)的颜色特征,通过设定合理的颜色阈值,可以将 “黄花区域” 与 “非黄花区域” 分开,得到二值化掩码图像。

  2. 形态学处理优化受光照、花瓣遮挡、图像噪声影响,初步分割结果会出现花瓣断裂、内部空洞、细小噪点等问题。通过膨胀、填充孔洞、开运算、去除小区域等操作,让每朵花形成完整、独立、平滑的连通区域。

  3. 连通域分析计数经过处理后,每一朵完整的黄花在二值图中对应一个独立的连通区域。使用连通域检测算法,统计区域数量,即可得到黄花的总数量。

整体流程可概括为:图像读取 → 颜色空间选择(HSV或RGB) → 阈值分割 → 形态学优化 → 连通域分析 → 花朵计数与结果可视化。

三、原始图像和程序代码

1、RGB转HSV后的黄花背景分割检测和计数代码

clear; clc; close all;
imtool close all;

%% 1. 读取图像
I = imread('E:\YellowFlower.jpg');
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
figure('Name','原始图像'), imshow(I), title('原始黄色花朵');

%% 2. 转换为 HSV 颜色空间
HSV= rgb2hsv(I);
H = HSV(:,:,1);
S = HSV(:,:,2);
V = HSV(:,:,3);
figure,
subplot(2,4,1),imshow(I),title('RGB图像');
subplot(2,4,2),imshow(R),title('R通道图像');
subplot(2,4,3),imshow(G),title('G通道图像');
subplot(2,4,4),imshow(B),title('B通道图像');
subplot(2,4,5),imshow(HSV),title('HSV图像');
subplot(2,4,6),imshow(H),title('H通道图像');
subplot(2,4,7),imshow(S),title('S通道图像');
subplot(2,4,8),imshow(V),title('V通道图像');

%% 3. 黄色阈值分割(根据情况调节参数,可用imtool进行辅助分析)
yellow_mask = (H >= 0.08) & (H <= 0.18) ...
& (S >= 0.83) ...
& (V >= 0.90);
figure,
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(yellow_mask);

%% ===================== 关键修改:形态学处理顺序调整 =====================
% 1. 先做轻微膨胀,把断裂的花瓣连接起来(解决“一朵花变两朵”的核心)
se_dilate = strel('disk', 2); % 稍大的结构元素,用于连接断开区域 %结构元素选取很关键
yellow_mask_dilated = imdilate(yellow_mask, se_dilate);

% 2. 填充花朵内部的孔洞
yellow_mask_filled = imfill(yellow_mask_dilated, 'holes');

% 3. 再做开运算去除噪点(先膨胀再腐蚀,不会再断开花朵)
se_open = strel('disk', 1);
yellow_mask_opened = imopen(yellow_mask_filled, se_open);

% 4. 去除小面积噪点(保留真实花朵)
yellow_mask3 = bwareaopen(yellow_mask_opened, 200); %修改去除非目标的区域大小至关重要

%% 4. 连通域分析 + 计数
cc = bwconncomp(yellow_mask3);
num_flowers = cc.NumObjects;

disp('=========================================');
disp(['✅ 修正后检测到的黄色花朵数量:', num2str(num_flowers), ' 朵']);
disp('=========================================');

% 花朵编号可视化
labeled = labelmatrix(cc);
rgb_label = label2rgb(labeled, 'jet', 'k', 'shuffle');
figure, imshow(rgb_label), title(['黄花编号可视化 | 总数:', num2str(num_flowers), '朵']);

%% 5. 提取结果
flower_extract = uint8(yellow_mask3) .* I;

%% 6. 显示结果

figure('Name','优化HSV分割结果');

subplot(1,3,1), imshow(I), title('RGB彩色图像');

subplot(1,3,2), imshow(yellow_mask3), title(['黄花掩码数量:', num2str(num_flowers), '朵']);

subplot(1,3,3), imshow(flower_extract), title('黄花的提取结果');

figure,

montage({I, yellow_mask3, rgb_label,flower_extract}, 'Size', [2 2]);

%sgtitle('蒙太奇显示', 'FontSize', 14);

set(gcf,'Name','蒙太奇结果展示','NumberTitle','off');

%titleHandle = sgtitle('蒙太奇显示');

%set(titleHandle,'FontSize',14,'Visible','on');

2.RGB颜色空间下的的黄花背景分割检测和计数代码

clear; clc; close all;
imtool close all;
%% 1. 读取图像
I = imread('E:\YellowFlower.jpg');
R = double(I(:,:,1));
G = double(I(:,:,2));
B = double(I(:,:,3));
figure('Name','原始图像'), imshow(I), title('原始黄色花朵');
imtool(I)
%% 2. 查看RGB各通道(和之前HSV版本保持一致)
figure,
subplot(1,4,1),imshow(I),title('RGB图像');
subplot(1,4,2),imshow(uint8(R)),title('R通道图像');
subplot(1,4,3),imshow(uint8(G)),title('G通道图像');
subplot(1,4,4),imshow(uint8(B)),title('B通道图像');
%% 3. 黄色花朵的RGB阈值分割(核心:纯RGB逻辑)
% 思路:黄色的特点是 R 和 G 通道都比较高,且明显大于 B 通道
% 1) R通道、G通道都要足够亮
% 2) R 略大于 G(典型黄花特征)
% 3) R 和 G 明显大于 B(避免偏绿或偏白区域被误判)
yellow_mask = (R >= 200) & ...
(G >= 200) & ...
(B>=0) &(B<= 50) ;

figure,
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(yellow_mask);
%yellow_mask=bwareaopen(yellow_mask,50);%去除区域面积小于50个像素的区域
title('RGB阈值初步分割结果');


%% ===================== 形态学处理(和你HSV版本保持同样的优化逻辑) =====================
% 1. 先轻微膨胀,连接断裂的花瓣
se_dilate = strel('disk', 1); %修改圆盘结构元素
yellow_mask_dilated = imdilate(yellow_mask, se_dilate);

% 2. 填充花朵内部的孔洞
yellow_mask_filled = imfill(yellow_mask_dilated, 'holes');

% 3. 开运算去除小噪点
se_open = strel('disk', 1);
yellow_mask_opened = imopen(yellow_mask_filled, se_open);

% 4. 去除小面积噪点,保留真实花朵
yellow_mask3 = bwareaopen(yellow_mask_opened, 200);

%% 4. 连通域分析 + 计数
cc = bwconncomp(yellow_mask3);
num_flowers = cc.NumObjects;

disp('=========================================');
disp(['✅ RGB空间检测到的黄色花朵数量:', num2str(num_flowers), ' 朵']);
disp('=========================================');

% 花朵编号可视化
labeled = labelmatrix(cc);
rgb_label = label2rgb(labeled, 'jet', 'k', 'shuffle');
figure, imshow(rgb_label), title(['黄花编号可视化 | 总数:', num2str(num_flowers), '朵']);

%% 5. 提取结果
flower_extract = uint8(yellow_mask3) .* I;

%% 6. 显示结果
figure('Name','RGB分割结果');
subplot(1,3,1), imshow(I), title('RGB彩色图像');
subplot(1,3,2), imshow(yellow_mask3), title(['黄花掩码数量:', num2str(num_flowers), '朵']);
subplot(1,3,3), imshow(flower_extract), title('黄花的提取结果');

figure,
montage({I, yellow_mask3, rgb_label}, 'Size', [1 3]);
sgtitle('蒙太奇显示', 'FontSize', 14);

四、主要运行结果

1. RGB转HSV后的黄花背景分割检测和计数代码主要运行结果

2. RGB颜色空间下的黄花背景分割检测和计数代码主要运行结果

本文采用两种方法实现了自然场景下草地黄花背景分割检测和计数,方法一将RGB空间转换到HSV 空间,其目的是将颜色与亮度分离,使黄色目标的特征更稳定、分割更鲁棒;另外一种方法是直接利用黄花的RGB颜色空间中R分量值和G分量的灰度值高,而B值低的特点进行阈值分割,通过程序运行表明两种方法都能较好的实现黄花分割和计数。由此可看出,图像在不同的彩色空间具有不同的特性,在实际图像处理任务中可以根据图像的特点选择合适的颜色空间进行图像处理。本文所提的两种方法都具有轻量、高效、易于理解,适合教学、实验及小型农业视觉项目,可扩展到其他颜色花朵(红花、白花、紫花)的检测与计数。

如果你觉得本文对你的学习和研究有所帮助,请点赞、收藏和关注,感谢您的支持!

http://www.jsqmd.com/news/769462/

相关文章:

  • Docker小白也能搞定:5分钟在Ubuntu 22.04上部署ARL灯塔(附常见错误排查清单)
  • 2026 嘉兴彩钢瓦金属屋面厂房防水防腐公司排名|5 家正规防水防腐企业推荐 + 避坑指南 - 速递信息
  • 别只怪电容!实测拆解:DCDC降压芯片输出纹波里的‘神秘方波’从哪来?
  • 如何轻松安装Koikatu HF Patch:200+插件整合与游戏增强完整指南
  • 2026年3月27日NSSCTF之[SWPU 2019]漂流记的马里奥
  • 终极指南:免费Windows风扇控制软件让你的电脑静音又冷静
  • Linux内核驱动开发:遇到`-Werror=implicit-fallthrough`编译报错别慌,三种主流解决方案实测对比
  • Cookie 和 Session 详解
  • D2DX:让经典暗黑破坏神2在现代PC上完美运行的终极方案
  • 量子误差缓解技术在Schwinger模型中的应用与优化
  • 告别Source Insight!VSCode用highlight-words插件实现F8高亮,嵌入式C/C++开发者的迁移指南
  • 深蓝词库转换:打破输入法壁垒的技术革命
  • 机械格栅技术选型与运维指南 资深厂家实操干货分享 - 奔跑123
  • WarcraftHelper终极指南:解决魔兽争霸3在现代系统的所有痛点
  • 拆解Android 13音频HAL:给SoC厂商的定制指南与AOSP标准接口深度解读
  • OpenCV联合C++/Qt 学习笔记(十三)----边缘检测
  • 论文写作技巧
  • 观察Taotoken在高并发测试下的API响应稳定性表现
  • 服务器双卡5090 配置深度学习环境
  • 当免费遇上专业:思源宋体如何让中文排版不再妥协
  • 2026年装修成品保护材料源头工厂直供指南:苏州、北京、上海等18城一站式采购方案 - 企业名录优选推荐
  • Claw-Social插件:为AI Agent构建语义社交发现与双轨通讯系统
  • 使用ContextAI统一管理AI编程助手上下文,提升开发效率与代码一致性
  • 终极指南:3步解决Windows老游戏兼容性,让经典游戏重获新生
  • VSCode 2026 + Trace32深度协同指南:实现AURIX TC4xx实时变量观测、CoreSight ETM流解析与UDS诊断会话一键触发(仅限首批内测License持有者公开)
  • iLogtail 从核心概念到实战的完整教程
  • ArcGIS新手避坑指南:从零开始,10分钟搞定你的第一张地图(附练习数据)
  • Stretchly完全指南:用开源工具构建科学的屏幕时间管理系统
  • 特朗普家族涉足AI!推出WorldRouter平台,还计划多产品布局,是割韭菜还是降价?
  • 基于NapCat的QQ机器人框架openclaw-NapCatQQ部署与开发指南