基于OpenCV的谷物颗粒识别

基于OpenCV的谷物颗粒识别

  • 一、程序整体功能介绍
    • 1.1 导入库与函数定义
    • 1.2 颜色分割与灰度处理
    • 1.3 二值化与轮廓检测
    • 1.4 绘制与计数
    • 1.5 主程序与结果展示
  • 二、算法原理与实现流程
    • 2.1算法原理
      • (1)颜色分割
      • (2)灰度处理与二值化
      • (3)轮廓检测与过滤
      • (4)绘制轮廓与计数
    • 2.2实现流程
      • (1)图像加载与颜色分割
      • (2)灰度处理与二值化
      • (3)轮廓检测与过滤
      • (4)绘制轮廓与计数
      • (5)结果展示
      • (6)主程序调用
  • 三、程序运行界面及结果分析
    • 3.1程序运行界面
    • 3.2结果分析
      • (1)程序参数调整
      • (2)图像特性适配
      • (3)计数结果准确性
      • (4)用户友好性
      • (5)结果的复现性
      • (6)进一步优化的可能性
  • 四、程序设计

一、程序整体功能介绍

1.1 导入库与函数定义

这个程序旨在通过图像处理技术实现对颗粒的计数。主要运用了计算机视觉库OpenCV以及数值计算库NumPy,通过颜色分割、灰度处理、二值化、轮廓检测等步骤,最终达到统计颗粒数量的目的。
首先,在程序的开头导入了必要的库,包括OpenCV用于图像处理,NumPy用于数组操作,以及Scikit-learn中的KMeans聚类算法,尽管在当前代码中并没有使用到KMeans算法,但可能为后续功能扩展保留了接口。
接下来定义一个名为grain_count的函数,该函数接受一个图像路径作为输入。在函数内部,首先使用OpenCV的imread函数读取了输入的图像。这一步是程序的起点,将图像加载到内存中以便后续处理。

1.2 颜色分割与灰度处理

接下来,程序进行了颜色分割的操作。通过将图像从BGR色彩空间转换为HSV色彩空间,程序能够更方便地选择特定颜色范围。通过设定HSV的上下阈值,程序创建了一个二值掩模,该掩模用于提取图像中特定颜色范围的像素。通过将这个掩模应用于原始图像,程序获得了一个仅包含感兴趣颜色的结果图像。程序对结果图像进行灰度处理,将其转换为单通道的灰度图像。这有助于简化图像,使得后续的处理步骤更为高效。

1.3 二值化与轮廓检测

程序进行二值化处理,将灰度图像转换为二值图像。通过设定一个阈值,像素的亮度高于阈值的被置为白色,低于阈值的被置为黑色。这一步骤是为了进一步简化图像,突出颗粒的轮廓。
然后,程序使用OpenCV的findContours函数来检测二值图像中的轮廓。这些轮廓代表了颗粒的形状,但在这一步中,并未对轮廓的大小进行过滤。接着,程序创建了一个全黑的图像,用于绘制筛选后的轮廓。

1.4 绘制与计数

在绘制轮廓的同时,程序通过计算轮廓的面积,对轮廓进行了过滤。只有当轮廓的面积大于50时,程序才将其计数,并在黑色图像上绘制相应的轮廓。这个阈值的选择是为了过滤掉一些噪声,确保只有较大的轮廓被计数,从而得到准确的颗粒数量。
最后,程序通过OpenCV展示了包含绘制轮廓的图像,等待用户按键后关闭窗口。函数返回被计数的颗粒数量。

1.5 主程序与结果展示

在主程序中,通过指定一个图像路径,调用了grain_count函数,并打印出了颗粒的数量。需要注意的是,代码中硬编码的期望颗粒数量(可能需要根据实际图像的特征进行调整。

总体而言,这个程序通过图像处理技术实现了对颗粒数量的计数,逐步进行颜色分割、灰度处理、二值化和轮廓检测等关键步骤,最终得到了准确的颗粒数量,并展示在了图像上。在实际应用中,用户只需替换图像路径,即可快速得到不同图像中颗粒的数量统计结果。

二、算法原理与实现流程

2.1算法原理

(1)颜色分割

颜色分割是图像处理中的一种常见技术,用于从图像中提取特定颜色范围的对象。在这个程序中,首先将图像从BGR色彩空间转换为HSV色彩空间。HSV表示图像的颜色信息更为直观,包括色相(Hue)、饱和度(Saturation)和亮度(Value)。通过设置在HSV空间中的颜色范围,程序创建了一个二值掩模,该掩模将位于指定颜色范围内的像素设为白色,而其他像素设为黑色。这一步骤的目的是提取出感兴趣颜色的部分,即颗粒的颜色。

(2)灰度处理与二值化

颜色分割后的图像通常仍然是一个多通道图像,为了简化后续处理,将其转换为灰度图像。灰度图像只有一个通道,表示图像的亮度信息。接着,通过设定一个阈值,将亮度高于阈值的像素置为白色,低于阈值的像素置为黑色,得到了二值图像。这一步的作用是突出颗粒的轮廓,方便后续的轮廓检测。

(3)轮廓检测与过滤

使用OpenCV的findContours函数来检测二值图像中的轮廓。每个轮廓是一系列相邻的像素点,代表了颗粒的形状。在这一步,程序检测到了所有的轮廓,而后通过计算轮廓的面积,过滤掉了面积较小的轮廓。过滤的目的是去除一些噪声或过小的区域,确保只有颗粒较大的轮廓被计数。

(4)绘制轮廓与计数

接下来,程序创建了一个全黑的图像,用于绘制筛选后的轮廓。通过遍历筛选后的轮廓,并通过drawContours函数在黑色图像上绘制,这一步将有助于可视化并进一步确认颗粒的位置。在绘制轮廓的同时,程序计数了有效的颗粒数量,即满足过滤条件的颗粒。

2.2实现流程

(1)图像加载与颜色分割

首先,使用OpenCV的imread函数加载输入的图像。随后,将图像从BGR色彩空间转换为HSV色彩空间,通过设定阈值范围,创建一个二值掩模,将图像中的感兴趣颜色提取出来。

(2)灰度处理与二值化

将颜色分割后的图像转换为灰度图像,简化后续处理。然后,通过设定阈值,将灰度图像转换为二值图像,突出颗粒的轮廓。

(3)轮廓检测与过滤

使用OpenCV的findContours函数检测二值图像中的轮廓。通过计算轮廓的面积,过滤掉面积较小的轮廓,以排除噪声。

(4)绘制轮廓与计数

创建一个全黑的图像,用于绘制筛选后的轮廓。遍历轮廓,绘制在黑色图像上,并计数有效的颗粒数量。

(5)结果展示

使用OpenCV展示包含绘制轮廓的图像,等待用户按键后关闭窗口。函数返回被计数的颗粒数量。

(6)主程序调用

在主程序中指定图像路径,调用grain_count函数,获取颗粒数量并打印。用户只需替换图像路径,即可快速得到不同图像中颗粒的数量统计结果。
整个实现流程通过图像处理的一系列步骤,从颜色分割到最终的轮廓计数,逐步提取并筛选出图像中的颗粒信息,最终得到准确的颗粒数量统计结果。

三、程序运行界面及结果分析

3.1程序运行界面

图 1 颗粒图像

图 1 颗粒图像
图 2 图像处理

图 2 图像处理结果

图 3 计数结果

图 3 计数结果

3.2结果分析

使用该颗粒计数程序对一张具有18颗谷物的图片进行计数并输出正确结果,表明程序在特定场景下取得了良好的效果。

(1)程序参数调整

通过使用该程序成功对一张图片中的18颗谷物进行计数,说明在这个特定场景下,程序的颜色分割、灰度处理、二值化等预处理步骤的参数设置较为合适。程序通过适当的参数选择,能够有效地区分出图像中的颗粒,而且过滤掉了可能的噪声。

(2)图像特性适配

成功的计数结果表明该程序对于一般的颗粒图像场景具有较好的适应性。程序通过检测轮廓并过滤,能够较好地应对不同颗粒大小和形状的情况,同时通过面积阈值的设定,有力地抑制了噪声对计数结果的干扰。

(3)计数结果准确性

输出的正确计数结果表明程序在对颗粒进行计数时具有较高的准确性。通过过滤掉面积较小的轮廓,程序成功排除了图像中的噪声,确保了计数结果的可靠性。程序的计数结果与实际图像中的颗粒数量一致,验证了其在此类任务上的有效性。

(4)用户友好性

程序通过在结果图像上绘制颗粒轮廓,以及直接输出颗粒数量,提供了用户友好的界面,使用户能够直观地了解计数结果。这种可视化的展示方式有助于用户对计数结果的直观理解,提高了程序的易用性。

(5)结果的复现性

由于程序对于特定场景的适应性较好,具有一定的鲁棒性和通用性,因此在不同的含有颗粒的图像上也可能取得类似的良好效果。用户在实际使用中,可以尝试将程序应用到其他颗粒图像中,观察其在不同场景下的表现。

(6)进一步优化的可能性

虽然程序在该场景下取得了正确的计数结果,但仍有可能通过进一步的参数调整和优化来提升程序的性能。例如,根据实际情况调整颜色范围、阈值等参数,或者考虑使用更复杂的图像处理算法,以适应更广泛的场景。

综合而言,程序在对一张具有18颗谷物的图片进行颗粒计数时取得了成功的结果,验证了其在特定场景下的有效性和准确性。这也为程序在其他颗粒图像中的应用提供了一定的信心。用户在使用程序时应关注实际图像的特性,可能需要进行一些参数的微调以适应不同的场景。

四、程序设计

import cv2
import numpy as np
from sklearn.cluster import KMeans

def grain_count(image_path):
    # 读取图像
    image = cv2.imread(image_path)

    # 颜色分割
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    lower_color = np.array([20, 50, 50])
    upper_color = np.array([30, 255, 255])
    mask = cv2.inRange(hsv, lower_color, upper_color)
    result = cv2.bitwise_and(image, image, mask=mask)

    # 灰度化
    gray = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY)

    # 二值化
    _, thresh = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY)

    # 查找轮廓
    _, contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 创建一个黑色图像
    black_image = np.zeros_like(image)

    # 绘制轮廓并计数
    count = 0
    for contour in contours:
        area = cv2.contourArea(contour)
        if area > 50:  # 过滤掉面积较小的轮廓,以排除噪声
            count += 1
            cv2.drawContours(black_image, [contour], -1, (0, 255, 0), 2)

    # 显示结果
    cv2.imshow("Contours", black_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    return count

if __name__ == "__main__":
    image_path = "grains.jpeg"  # 替换为实际图像路径
    count = grain_count(image_path)
    print(f"Number of grains: ",count)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/318231.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu安装node

1 下载 node 官网下载 如果需要其他版本,点击上图的Other Downloads 这里下载的版本是20.11.0 Linux Binaries (x64),下载下来后是node-v20.11.0-linux-x64.tar.xz这样的格式,直接右键解压得到如下目录: 直接拷贝该文件夹到指定目…

哈希表的实现(1)----除留余数法实现

一,哈希表的介绍 哈希表是一种通过哈希思想实现的一种数据结构。哈希表这种数据结构的特点便是可以通过一个值快速的定位这个值所在的位置实现插入,删除,查找。在这篇博客里面,我们便来实现一个通过除留余数法实现的一个哈希表。 …

Alibaba-> EasyExcel 整理3

1 导入依赖 <!-- easyExcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version >3.2.1</version><exclusions><exclusion><artifactId>poi-ooxml-schemas</art…

基于SpringBoot+Vue实现的二手交易系统

系统介绍 校园二手交易网站是一种专门针对有二手物品交易需求用户的二手交易的网站。它的设计和开发主要是为了满足用户之间的二手物品交易需求&#xff0c;方便大家在线买卖二手物品。近年来&#xff0c;随着互联网技术的发展&#xff0c;人们越来越喜欢在线购物&#xff0c;…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-6 线性控制器设计Linear Controller Design

本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-6 线性控制器设计Linear Controller Design

31 树的存储结构一

无法直接用数组表示树的逻辑结构&#xff0c;但是可以设计结构体数组对节点间的关系进行描述&#xff1a;【如表】 这样做的问题&#xff1a; 可以利用 组织链表 parent指针&#xff1a; 注意&#xff1a;树结点在 组织链表 中的位置不代表树的任何逻辑关系 树的架构图&#xf…

软件测试|使用Python抓取百度新闻的页面内容

简介 作为技术工程师&#xff0c;在繁忙的工作中我们不一定有时间浏览发生的热点新闻&#xff0c;但是懂技术的我们不需要访问网站来看当下发生的大事&#xff0c;我们可以使用网络爬虫的技术来获取当下最新最热的新闻&#xff0c;本文就来介绍一下使用Python抓取一下百度新闻…

2、Redis持久化、主从与哨兵:构建强大而稳定的数据生态

Redis作为一款高性能的内存数据库&#xff0c;其在持久化、主从复制和哨兵系统方面的支持使其在大规模应用和高可用性场景中脱颖而出。本文将深入探讨Redis的持久化机制、主从复制以及哨兵系统&#xff0c;为构建强大而稳定的数据生态揭示关键技术。 持久化&#xff1a;数据的…

B端产品经理学习-版本规划管理

首先我们回顾一下用户故事&#xff0c;用户故事有如下特点&#xff1a; PRD文档的特点则如下&#xff1a; B端产品中用户角色不同&#xff0c;需求侧重也不同 决策人——公司战略需求&#xff1a;转型升级、降本增效、品牌提升等 管理负责人——公司管理需求&#xff1a;提升…

Kafka详解

KAFKA 1、消息队列&#xff08;了解&#xff09; 1-1 消息队列介绍 英文名&#xff1a;Message Queue&#xff0c;经常缩写为MQ。从字面上来理解&#xff0c;消息队列是用来存储传递消息的 1-2 消息队列应用场景 应用耦合-- 使用消息队列解耦 后端业务开发实名认证 图片上传功…

sectigo ip证书种类买一年送一月

Sectigo旗下的IP证书是专为只有公网IP地址的网站准备的。Sectigo旗下的数字证书大多是域名证书&#xff0c;例如&#xff0c;单域名SSL证书、多域名SSL证书、通配符SSL证书等。这些证书申请时必须验证域名所有权&#xff0c;申请者需要有一个拥有管理全的域名网站&#xff0c;那…

四、C语言中的数组:数组的创建与初始化

其实在之前的学习中我们已经或多或少接触到了数组&#xff0c;有关scanf()的安全用法中我们提到了如何避免数组溢出的问题&#xff0c;详情可以查看二、C语言数据类型与变量&#xff08;scanf和printf (4&#xff09;完) 这一章我们将详细学习数组在C语言中的应用 本章的学习…

MaxKey 单点登录认证系统——实现登录后自动跳转及分析思路

Maxkey单点登录系统集成业务系统应用之后&#xff0c;登录界面登录之后不会自动跳转业务系统&#xff0c;需要在首页点击相应应用之后&#xff0c;才能实现跳转业务系统&#xff0c;故以下本人提供解决方法和分析思路。 环境配置 本例使用的是CAS协议实现单点登录 Maxkey 服务…

优化 - 重构一次Mysql导致服务器的OOM

概述 优化了一次前后端处理不当导致的CPU的一次爆机行为&#xff0c;当然&#xff0c;这和服务器的配置低也有着密不可分的关系&#xff0c;简单的逻辑学告诉我们&#xff0c;要找到真正的问题&#xff0c;进行解决&#xff0c;CPU爆机的关键点在于前后端两个方面&#xff0c;…

POI-tl 知识整理:整理1 -> 利用模板向word中写入数据

1 文本传值 Testpublic void testText() throws Exception {XWPFTemplate template XWPFTemplate.compile("D:\\Idea-projects\\POI_word\\templates.docx");Map<String, Object> map new HashMap<>();map.put("title", "Hi, girl"…

如何在你的网站接入QQ登录?

文章目录 准备阶段申请QQ登录的权限创建应用最后上传qqlogin.php代码 准备阶段 国内服务器和备案域名需要你有张独一无二本人的身份证你正面手持身份证的图片一张100px*100px的网站图标 申请QQ登录的权限 首先访问qq互联&#xff0c;点击我直接访问 登陆完成后我们点击面的…

橘子学Spring01之spring的那些工厂和门面使用

一、Spring的工厂体系 我们先来说一下spring的工厂体系(也称之为容器)&#xff0c;得益于大佬们对于单一职责模式的坚决贯彻&#xff0c;在十几年以来spring的发展路上&#xff0c;扩展出来大量的工厂类&#xff0c;每一个工厂类都承担着自己的功能(其实就是有对应的方法实现)…

(三)CMake为什么几乎一统C++跨平台构建?

先看几个简单的例子再回头来看这个问题 回想一下当我们用windows写C第一个Hello World!的步骤&#xff0c;先用VS IDE 创建一个控制台的工程&#xff0c;IDE 会自动生成一个 cpp 文件&#xff0c;里面有一句 输出"Hello World!" 代码&#xff0c;这个时候按下F5 就可…

PTA 1117 数字之王 C++实现 简易代码

给定两个正整数 N1​<N2​。把从 N1​ 到 N2​ 的每个数的各位数的立方相乘&#xff0c;再将结果的各位数求和&#xff0c;得到一批新的数字&#xff0c;再对这批新的数字重复上述操作&#xff0c;直到所有数字都是 1 位数为止。这时哪个数字最多&#xff0c;哪个就是“数字…

在线直线度测量仪确保了出厂圆棒无不合格品

在线直线度测量仪确保了出厂圆棒无不合格品 随着生产设备的改进&#xff0c;利用基础材料进行生产的厂家对品质要求也越来越高&#xff0c;其中圆形棒管材的直线度尺寸&#xff0c;也是广受关注&#xff0c;对其进行矫直检测&#xff0c;使其出厂无不合格品。 变抽检为全检 以前…