基于OpenCV的谷物颗粒识别

2024-01-13 23:12
文章标签 opencv 识别 颗粒 谷物

本文主要是介绍基于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 KMeansdef 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 = 0for contour in contours:area = cv2.contourArea(contour)if area > 50:  # 过滤掉面积较小的轮廓,以排除噪声count += 1cv2.drawContours(black_image, [contour], -1, (0, 255, 0), 2)# 显示结果cv2.imshow("Contours", black_image)cv2.waitKey(0)cv2.destroyAllWindows()return countif __name__ == "__main__":image_path = "grains.jpeg"  # 替换为实际图像路径count = grain_count(image_path)print(f"Number of grains: ",count)

这篇关于基于OpenCV的谷物颗粒识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/603116

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

树莓派5_opencv笔记27:Opencv录制视频(无声音)

今日继续学习树莓派5 8G:(Raspberry Pi,简称RPi或RasPi)  本人所用树莓派5 装载的系统与版本如下:  版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下: 今天就水一篇文章,用树莓派摄像头,Opencv录制一段视频保存在指定目录... 文章提供测试代码讲解,整体代码贴出、测试效果图 目录 阶段一:录制一段

Verybot之OpenCV应用三:色标跟踪

下面的这个应用主要完成的是Verybot跟踪色标的功能,识别部分还是居于OpenCV编写,色标跟踪一般需要将图像的颜色模式进行转换,将RGB转换为HSV,因为对HSV格式下的图像进行识别时受光线的影响比较小,但是也有采用RGB模式来进行识别的情况,这种情况一般光线条件比较固定,背景跟识别物在颜色上很容易区分出来。         下面这个程序的流程大致是这样的: