【传知代码】图像处理解决种子计数方法

文章目录
- 一、背景及意义介绍
- 研究背景
- 农业考种需求
- 传统计数方法的局限性
- 人工计数
- 仪器设备计数
- 研究意义
- 提高育种效率
- 提高计数准确性
- 广泛的适用性
- 数据存档与分析便利
- 二、概述
- 三、材料与数据准备以及方法介绍
- 整体流程
- 图像采集
- 图像预处理
- 形态学操作
- 腐蚀运算
- 开运算
- 图像二值化
- 种子计数与标记
- 关键技术原理
- 腐蚀运算原理
- 开运算原理
- 二值化原理
- 方法优势
- 速度优势
- 适用性广
- 设备简单
- 记录留存
- 四、Matlab代码实现
- 代码结构概述
- 部分代码及注释
- 五、结果分析
- 图像处理结果
- 计数结果准确性
- 粘连区域处理不当:
- 二值化阈值不合适:
- 图像噪声影响:
- 六、总结
- 部署方式
本文参考来源:传知代码平台
一、背景及意义介绍
以下是对基于Matlab图像的种子计数方法的背景及意义介绍:
研究背景
农业考种需求
在农业育种研究中,种子计数是一个较为重要的环节。考种过程涉及对大量种子的各种性状进行观察和测量,其中准确的种子数量统计是基础工作之一。例如,在评估种子的发芽率、纯度、产量潜力等指标时,都需要知道精确的种子数量。
传统计数方法的局限性
人工计数
当计数量较大时,长时间、重复性的数粒工作会导致人员疲劳,从而产生一定的误差。而且人工计数效率低下,无法满足大规模育种研究中对种子快速计数的需求。
人工计数难以保证准确性和一致性,不同人员计数结果可能存在差异。
仪器设备计数
现有的一些仪器设备用于种子计数也有一定的局限性。它们不适用于种类繁多、大小不一、形状多变的种子。例如,一些基于光电原理的计数器可能对种子的形状和大小有特定要求,对于不规则形状或过小过大的种子可能无法准确计数。
仪器设备通常比较昂贵,对于一些小型育种机构或科研团队来说,购置成本较高,限制了其广泛应用。
研究意义
提高育种效率
基于Matlab图像的种子计数方法能够快速、准确地统计种子数量,大大缩短了考种过程中种子计数的时间,提高了育种工作的整体效率。这使得科研人员能够更快地获取种子数量数据,进而更高效地进行后续的育种研究工作,如筛选优良品种、分析种子性状等。
提高计数准确性
该方法通过一系列图像处理技术,如腐蚀运算、开运算和二值化等,能够有效处理种子之间的粘连问题,减少因粘连导致的计数误差。同时,还可以对计数结果进行人工校正,进一步提高计数的准确性,为育种研究提供更可靠的数据支持。
广泛的适用性
这种计数方法具有广泛的适用性。它不仅可以用于各种类型的种子计数,只要满足在单一背景下平铺的条件即可。而且还可以扩展到其他需要计数的物品中,为相关领域的研究和应用提供了一种通用的计数解决方案。
成本效益优势
所需设备简单,只需要一台照相设备、一台计算机和常见的软件(如Matlab),相较于昂贵的专用种子计数仪器设备,大大降低了成本。这使得更多的育种机构和科研团队,包括一些小型机构和团队,都能够采用这种方法进行种子计数,促进了种子计数技术的普及和应用。
数据存档与分析便利
可对计数图片进行存档,这对于后续的数据分析和研究回顾非常有帮助。科研人员可以随时查看原始图像和计数结果,进行进一步的分析和验证,有助于提高育种研究的科学性和严谨性。
二、概述
基于Matlab图像的种子计数方法是为解决考种中人工计数繁重且易出错以及仪器设备计数有局限等问题而提出的,它通过图像采集、预处理、形态学操作及二值化等步骤对种子进行计数,具有速度快、适用性广、设备简单且可存档校正等优势,对提高育种效率和准确性等有重要意义。原文地址:
https://kns.cnki.net/kcms2/article/abstract?v=SY7jeTtuViJwrslGWo6PtHREhVR5hpz7DWu15XiWq-dWAodI4Mmap9yhKnPlhcZY2rVJunoNOwIqCRetJv0fR2O3zeDxxcHZwgkU8-3YNi3ksDm1XXpB968rX0rKvDl7zC-AHp-tLfgvt2TMSh4cVNKFlE-r2GR8jVcyW4JdawY=&uniplatform=NZKPT
三、材料与数据准备以及方法介绍
整体流程

图像采集
准备合适的背景(如白色A4纸),将种子均匀撒在上面,尽量减少粘连,然后使用拍摄工具获取照片,要求拍照范围不超出背景,且背景颜色单一。
图像预处理
Photoshop处理(可选):可以利用Photoshop软件提取背景颜色,调节颜色容差,使用魔棒工具和选框工具删除背景颜色,再填充黑色作为背景色。这一步骤有助于简化后续Matlab处理中的背景干扰。
Matlab中的灰度化处理:通过rgb2gray函数将彩色图像转换为灰度图像。灰度图像的像素点用颜色深度表示,范围是0(黑色)到255(白色)。灰度化处理的目的是减少图像数据量,使其更容易处理。
形态学操作
腐蚀运算
首先定义结构元素,结构元素可以是圆形、方形、线形等多种形状。腐蚀运算的思路是结构元素在整幅图像中移动,当结构元素与图像上对应像素点的像素值全部重叠相等时,保留这个像素点值。腐蚀运算的作用是使物体边界向内部收缩,也可以把小于结构元素的物体去除。
开运算
开运算是对目标图像先进行腐蚀运算再进行膨胀运算。它的作用是去除背景杂色和图像上的小异物,平滑较大区域的边界,不明显的改变区域的面积,对目标区域细小粘连点处分离等。
图像二值化
运用算法在灰度化的图像中寻找一个确定的阈值,利用阈值把灰度图像中的像素划分为2值:目标(用“1”表示,代表种子)和背景(用“0”表示)。经过前面的处理,特别是将背景替换为黑色后,阈值更容易确定,目标和背景也更容易划分,减少了背景杂色对算法的干扰。
种子计数与标记
通过计算连通图的数量得到种子数量。同时,对每个连通区域进行编号,并在原始图像上标记出连通区域的中心位置以及编号,方便人工校正。
关键技术原理
腐蚀运算原理
从数学形态学角度,腐蚀运算可以用集合的概念来解释。设原始图像为集合(A),结构元素为集合(B),腐蚀运算的结果(A\ominus B)定义为:(A\ominus B={x:B+x\subseteq A}),其中(x)是图像中的像素点坐标,(B + x)表示结构元素(B)平移到坐标(x)处。直观上,腐蚀运算就是寻找原始图像中那些能使结构元素完全包含在原始图像内的像素点。
开运算原理
开运算(A\circ B=(A\ominus B)\oplus B),其中(\oplus)表示膨胀运算。膨胀运算与腐蚀运算相反,它是将结构元素覆盖的区域进行扩展。开运算先通过腐蚀运算去除小于结构元素的物体以及一些噪声点,然后再通过膨胀运算恢复被腐蚀过度的目标物体的形状,从而达到去除背景杂色和分离粘连区域的效果。
二值化原理
二值化是根据图像的灰度值分布确定一个阈值(T),对于灰度值大于等于(T)的像素点赋值为“1”,对于灰度值小于(T)的像素点赋值为“0”。常用的阈值选择方法有全局阈值法(如Otsu算法)和局部阈值法。在该方法中,由于前期对背景进行了处理,使得阈值的确定相对简单,采用了一种基于图像灰度特征的简单阈值确定方法。
方法优势
速度优势
相对人工计数,该方法处理速度快,尤其是当计数数量较多时,这种速度优势更加明显。
适用性广
在单一的背景中只需要把种子平铺,就可以面对各种类型种子,并且该方法还可以扩展到其他需要计数的物品中。
设备简单
只需要一台照相设备、一台计算机以及几个常见的软件(如Matlab)即可开展工作。
记录留存
可对计数图片进行存档,还可以对图片进行人工校正,减少误差。
四、Matlab代码实现
代码结构概述
整个代码流程按照论文中的方法步骤进行,包括图像读取、背景去除、灰度化处理、腐蚀运算、开运算、二值化处理以及连通域分析和计数标记。
部分代码及注释
% 灰度处理
J = rgb2gray(nameFinal);
subplot(3, 3, 3);
imshow(J);
title('灰度图像');% 调节灰度图像
J1 = imadjust(J);
subplot(3, 3, 4);
imshow(J1);
title('调节后的灰度图像');% 定义结构元素
SE1,SE2% 在灰度化图中进行腐蚀运算
J2 = imerode(J1, SE2);
subplot(3, 3, 5);
imshow(J2);
title('腐蚀运算后的图像');% 在灰度化图中进行开运算
J3 = imopen(J2, SE1);
subplot(3, 3, 5);
imshow(J3);
title('开运算后的图像');% 在灰度化图中寻找阈值
level = graythresh(J3); % 进行二值化运算
J4 = im2bw(J3, level);
subplot(3, 3, 6);
imshow(J4);
title('二值化后的图像');% 在二值化图中进行腐蚀运算
J5 = imerode(J4, SE2);
subplot(3, 3, 7);
imshow(J5);
title('再次腐蚀后的图像');% 在二值化图中进行开运算
J6 = imopen(J5, SE1);
subplot(3, 3, 8);
imshow(J6);
title('再次开运算后的图像');% 计算连通数

五、结果分析
图像处理结果
观察各个子图,可以看到图像经过一系列处理后的变化。原始图像显示了种子在白色A4纸上的原始状态。去除背景后的图像突出了种子主体。灰度图像将彩色图像转换为灰度形式,便于后续处理。腐蚀运算和开运算分别对图像进行了收缩和优化边界的操作,二值化图像则将图像分为目标(种子)和背景两部分,使得种子更容易被识别和计数。
计数结果准确性
通过连通域分析得到的种子计数结果与实际手动计数结果进行比较。如果两者存在差异,可能是由于以下原因:
粘连区域处理不当:
种子之间的粘连可能没有被完全分离,导致计数不准确。可以尝试调整腐蚀运算和开运算的结构元素大小或重复次数。
二值化阈值不合适:
不合适的阈值可能导致部分种子被错误地分类为背景或反之。可以手动调整阈值或尝试使用更先进的阈值选择方法。
图像噪声影响:
如果图像存在噪声,可能会干扰形态学操作和二值化过程。可以考虑在预处理阶段增加噪声去除步骤,如中值滤波或高斯滤波。
六、总结
通过本次复现,基本实现了论文中描述的基于Matlab图像的种子计数方法。在实际应用中,需要根据不同的种子类型和图像质量对代码进行适当的调整和优化,以提高计数的准确性和可靠性。
部署方式
Matlab版本:Matlab2022a
点击链接,发现更多内容 传知代码平台
相关文章:
【传知代码】图像处理解决种子计数方法
文章目录 一、背景及意义介绍研究背景农业考种需求传统计数方法的局限性人工计数仪器设备计数 研究意义提高育种效率提高计数准确性广泛的适用性数据存档与分析便利 二、概述三、材料与数据准备以及方法介绍整体流程图像采集图像预处理形态学操作腐蚀运算开运算 图像二值化种子…...
WPF 特性------Binding
工业控制中,经常会需要把一个bool 型输入信号的状态显示在面板上,使用wpf 绑定的办法,可简洁实现: 实现步骤: 1,定义类: using System; using System.Collections.Generic; using System.Com…...
深入解析 FastAPI 查询参数:配置、类型转换与灵活组合
深入解析 FastAPI 查询参数:配置、类型转换与灵活组合 本文全面解析了 FastAPI 查询参数的使用方法,包括配置默认值、设为可选或必选参数、类型转换以及组合使用等实用技巧。通过查询参数,开发者可以在路径操作函数中接收动态输入࿰…...
大学城水电管理系统开发:Spring Boot指南
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
Lua 从基础入门到精通(非常详细)
目录 什么是 Lua? Lua 环境安装 Lua基本语法 注释 数据类型 nil(空) Boolean number(数字) string(字符串) function(函数) userdata thread tableÿ…...
[MySQL#11] 索引底层(2) | B+树 | 索引的CURD | 全文索引
目录 1.B树的特点 索引结构 复盘 其他数据结构的对比 B树与B树总结 聚簇索引与非聚簇索引 辅助索引 2. 索引操作 主键索引 1. 创建主键索引 第一种方式 第二种方式 第三种方式 2. 查询索引 第一种方法 第二种方法 第三种方法 3. 删除索引 删除主键索引 删除…...
一个指针可以被声明为 `volatile`
一个指针可以被声明为 volatile。当指针被声明为 volatile 时,指针本身的地址值可能会在程序之外的控制下发生变化,这意味着编译器在使用该指针时必须每次都重新从内存中读取它的地址,而不能假设指针的地址保持不变。 为什么指针可以是 vola…...
[0260].第25节:锁的不同角度分类
MySQL学习大纲 我的数据库学习大纲 从不同维度对锁的分类: 1.对数据操作的类型划分:读锁和写锁 1.1.读锁 与 写锁概述: 1.对于数据库中并发事务的读-读情况并不会引起什么问题。对于写-写、读-写或写-读这些情况可能会引起一些问题,需要使用…...
android数组控件Textview
说明:android循环控件,注册和显示内容 效果图: step1: E:\projectgood\resget\demozz\IosDialogDemo-main\app\src\main\java\com\example\iosdialogdemo\TimerActivity.java package com.example.iosdialogdemo;import android.os.Bundl…...
openpnp - 手工修改配置文件(元件高度,size,吸嘴)
文章目录 openpnp - 手工修改配置文件(元件高度,size,吸嘴)概述笔记parts.xmlpackages.xml 手工将已经存在的NT1,NT2拷贝出来改名备注END openpnp - 手工修改配置文件(元件高度,size,吸嘴) 概述 载入新板子贴片准备时,除了引入Named CSV文件,还要在ope…...
Java 集合一口气讲完!(中)d=====( ̄▽ ̄*)b
Java 队列 Java集合教程 - Java队列 队列是只能在其上执行操作的对象的集合两端的队列。 队列有两个末端,称为头和尾。 在简单队列中,对象被添加到尾部并从头部删除并首先删除首先添加的对象。 Java Collections Framework支持以下类型的队列。 简单…...
位运算:计算机科学中的基本操作
深入探讨位运算:计算机科学中的基本操作 位运算是计算机科学中的一种重要工具,它直接作用于数据的二进制位,能够高效地进行数据处理。本文将详细介绍位运算的基本概念、种类以及其实际应用。 什么是位运算? 位运算是对整数的二…...
MPSK(BPSK/QPSK/8PSK)调制解调的Matlab仿真全套
一、概述 MPSK(BPSK、QPSK、8PSK)等是常用的相位调制方式,本文对数据获取、比特流组织、基带调制、上变频发送、添加噪声、接收下变频、基带解调、数据还原等过程进行仿真。 模块化、通用化设计,将函数分为(1)数据读取转比特流;(2)基带调制【参数控制调制类型】;(…...
如何为STM32的EXTI(外部中断)编写程序
要为STM32的EXTI(外部中断)编写程序,你需要遵循以下步骤: 1. 初始化GPIO 首先,需要初始化连接到外部中断线的GPIO引脚。这个引脚需要配置为输入模式,并且根据需要选择上拉、下拉或浮空。 GPIO_InitTypeDe…...
八、快速入门Kubernetes之service
文章目录 Service:one: VIP和Service代理:star: 代理模式分类2、iptables代理模式3、ipvs代理模式 :two: ClusterIP:three:实列Service:four: Headless Service实列:five: NodePort:six: LoadBalancer:seven: ExternalName Service ⭐️ 概念:Kubernetes Service 定…...
JVM 类加载机制详解
JVM 类加载机制详解 在 Java 虚拟机(JVM)中,类加载机制是一个非常重要的组成部分,它负责将类的字节码文件加载到内存中,并进行一系列的处理,最终使类能够被虚拟机使用。本文将详细介绍 JVM 类加载机制的相…...
在 JavaScript 中,`Array.prototype.filter` 方法用于创建一个新数组,该数组包含通过测试的所有元素
文章目录 1、概念在你的代码中的作用示例总结 2、实战3、formattedProducts4、filteredProducts 1、概念 在 JavaScript 中,Array.prototype.filter 方法用于创建一个新数组,该数组包含通过测试的所有元素。具体来说,filter 方法会遍历数组中…...
63 mysql 的 行锁
前言 我们这里来说的就是 我们在 mysql 这边常见的 几种锁 行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁, 表共享锁, 表排他锁 意向共享锁, 意向排他锁, 主要是 为了表粒度的锁获取的同步判断, 提升效率 意向共享锁, 意向排他锁 这边主要的逻辑意义是数据表中是否有任…...
ubuntu文件编辑操作
Vim 基本操作指南 在 vim 中打开文件后,可以按照以下步骤进行编辑和保存: 进入插入模式 打开文件后,默认情况下 vim 处于命令模式,无法直接输入文本。按下 i 键进入插入模式(会看到左下角显示 -- INSERT --࿰…...
Nuxt.js 应用中的 nitro:config 事件钩子详解
title: Nuxt.js 应用中的 nitro:config 事件钩子详解 date: 2024/11/2 updated: 2024/11/2 author: cmdragon excerpt: nitro:config 是 Nuxt 3 中的一个生命周期钩子,允许开发者在初始化 Nitro 之前自定义 Nitro 的配置。Nitro 是 Nuxt 3 的服务器引擎,负责处理请求、渲…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
