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

相关文章

vcpkg安装opencv中的特殊问题记录(无法找到opencv_corexd.dll)

我是按照网上的vcpkg安装opencv方法进行的(比如这篇:从0开始在visual studio上安装opencv(超详细,针对小白)),但是中间出现了一些别人没有遇到的问题,虽然原因没有找到,但是本人给出一些暂时的解决办法: 问题1: 我在安装库命令行使用的是 .\vcpkg.exe install opencv 我的电脑是x64,vcpkg在这条命令后默认下载的也是opencv2:x6

基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别

转发来源:https://swift.ctolib.com/ooooverflow-chinese-ocr.html chinese-ocr 基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别 环境部署 sh setup.sh 使用环境: python 3.6 + tensorflow 1.10 +pytorch 0.4.1 注:CPU环境

百度OCR识别结构结构化处理视频

https://edu.csdn.net/course/detail/10506

brew install opencv@2 时报错 Error: Can't create update lock in /usr/local/var/homebrew/locks!

解决方案,报错里已经说明了: 我的解决方案: sudo chown -R "$USER":admin /usr/local   stackoverflow上的答案 I was able to solve the problem by using chown on the folder: sudo chown -R "$USER":admin /usr/local Also you'

Pycharm配置conda环境(解决新版本无法识别可执行文件问题)

引言: 很多小伙伴在下载最新版本的pycharm或者更新到最新版本后为项目配置conda环境的时候,发现文件夹目录中无法显示可执行文件(一般为python.exe),以下就是本人遇到该问题后试验和解决该问题的一些方法和思路。 一般遇到该问题的人群有两种,一种是刚入门对pycharm进行conda环境配置的小白(例如我),不熟悉相关环境配置的操作和过程,还有一种是入坑pycharm有段时间的老手

神经网络第四篇:推理处理之手写数字识别

到目前为止,我们已经介绍完了神经网络的基本结构,现在用一个图像识别示例对前面的知识作整体的总结。本专题知识点如下: MNIST数据集图像数据转图像神经网络的推理处理批处理  MNIST数据集          mnist数据图像 MNIST数据集由0到9的数字图像构成。像素取值在0到255之间。每个图像数据都相应地标有“7”、“2”、“1”等数字标签。MNIST数据集中,

vscode python pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

在vscode中控制台运行python文件出现:无法将"pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 使用vscode开发python,需要安装python开发扩展: 本文已经安装,我们需要找的是python安装所在目录,本文实际路径如下: 如果在本文路径中没有此目录,请尝试在C盘中搜索 python,搜索到相关python目录后,点击Python 3.9进入目录,

《学习OpenCV》课后习题解答7

题目:(P105) 创建一个结构,结构中包含一个整数,一个CvPoint和一个 CvRect;称结构体为“my_struct”。 a. 写两个函数:void Write_my_strct(CvFileStorage* fs, const char * name, my_struct* ms) 和 void read_my_struct(CvFileStorage* fs, CvFileNode

OpenCV中的按钮问题

在HighGUI中,没有显示提供任何形式的按钮。一般有两种方法替代: 1.用只有两个状态的滑动条来替代按钮。开关(switch)事实上就是只有两个状态的滑动条,这两个状态是on和off。然后通过回调函数来实现相关的功能。 实例源码(使用滑动条实现一个开关功能) #include<cv.h>#include<highgui.h>int g_switch_value = 0;void swit

《学习OpenCV》课后习题解答6

题目:(P104) 使用cvCmp()创建一个掩码。加载一个真实的图像。使用cvsplit()将图像分割成红,绿,蓝三个单通道图像。 a.找到并显示绿图。 b.克隆这个绿图两次(分别命名为clone1和clone2)。 c.求出这个绿色平面的最大值和最小值。 d.将clone1的所有元素赋值为theash=(unsigned char)((最大值-最小值)/2.0)。 e.将clone