基于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

相关文章

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

Python验证码识别方式(使用pytesseract库)

《Python验证码识别方式(使用pytesseract库)》:本文主要介绍Python验证码识别方式(使用pytesseract库),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1、安装Tesseract-OCR2、在python中使用3、本地图片识别4、结合playwrigh

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.