使用OpenCV-python对植物图片进行分类

05-图像分类(含有3700张鲜花照片的数据集) 文章目录1. 数据准备 1. 数据准备 首先导入我们需要的包: import matplotlib.pyplot as plt import numpy as np import os import PIL import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers from tensorflow.keras.models import Sequential import pathlib 阅读详情

图片分类的思路和需要加载的库函数说明

图片分类的基本思路如下

  1. 首先需要有一个标注好图片里面花朵名称的数据集,例如命名好的rose.png
  2. 特征提取,即提取图片中的重要特征(能区别于其他图片的特征),并把重要特征加工成可以训练的数据,因为每种花的颜色分布不同,这里的思路是计算图片的彩色直方图信息,作为图片的特征。
  3. 标签提取,即把图片标注加工成数值信息,这里的思路是把图片的字符串名字转换成唯一的数字序列。
  4. 挑选一个分类器模型,例如随机森林分类器,然后划分训练集和测试集进行训练,得到学习器,即分类模型。
  5. 用这个训练好的模型,对图片进行分离,即利用模型预测。

需要使用的库函数和功能说明

# 标签处理
from sklearn.preprocessing import LabelEncoder

# 随机森林分类器模型
from sklearn.ensemble import RandomForestClassifier

# 对数据集进行有效划分的方法,划分成训练集和测试集
# from sklearn.cross_validation import train_test_split
# 在python新版本中,train_test_split被移动到model_selection中
from sklearn.model_selection import train_test_split

# 分类器性能评估报告
from sklearn.metrics import classification_report

# 基本矩阵运算库
import numpy as np

# 文件操作模块,主要是进行文件搜索和通配符操作
import glob

# opencv函数库
import cv2 

核心代码分析

数据预处理:文件处理和命名匹配

glob函数使用参考:python glob model - 漩涡鸣人 - 博客园

# 加载所有的图片和蒙版
imagePath = "dataset/images"
maskPath  = "dataset/masks"
# 利用sorted函数实现名字的一一对应,对每个图片进行蒙版的加载
imagePaths = sorted(glob.glob(imagePath + "/*.png"))
maskPaths  = sorted(glob.glob(maskPath + "/*.png"))

数据预处理:特征提取和标签提取

# 计算直方图,返回的是均一化之后的彩色直方图数据
features = desc.describe(image,mask)
# 构造测试数据集的特征信息集合
data.append(features)
# 注意图片的命名格式为"image_crocus_0001.png",我们需要提取的"crocus"是倒数第二个
target.append(imagePath.split("_")[-2])
# 初始化一个打标签的对象
le = LabelEncoder()
# 对target进行数字化标签index(因为字符串这种特征是不能直接拿来训练的,需要转换成唯一的数值)
target = le.fit_transform(target)

标签处理:unique()和fit_transform()的用法

target = ["happy","birthday","happy","wedding","happy","ending"]

unique对这串字符串进行去重:

targetNames = np.unique(target)
print(targetNames)
['birthday' 'ending' 'happy' 'wedding']

fit_transform最后算出每个字符串label对应的标签序号,此时brithday,ending,happy,wedding按照字母表顺序,分别对应0~3。

le = LabelEncoder()
target = le.fit_transform(target)
print(target)
[2 0 2 3 2 1]

学习模型:数据划分和模型训练

# 对数据进行训练集和测试集的划分,划分比例是7:3
(trainData,testData,trainTarget,testTarget) = \
    train_test_split(data,target,test_size=0.3,random_state=42)

# 初始化一个随机森林分类器模型
model = RandomForestClassifier(n_estimators=25,random_state=84)
# 用训练集训练这个分类器模型
model.fit(trainData,trainTarget)

# 用测试集合评估分类器性能,并打印出来
print(classification_report(testTarget, model.predict(testData),\
                            target_names=targetNames))

预测输出:利用训练好的模型进行图片分类

# 生成图片的特征(彩色直方图)
features = desc.describe(image,mask)
# 预测输出,从数字index转换成对应的字符串标签
flower = le.inverse_transform(model.predict([features]))[0]

完整代码附录和运行结果

from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestClassifier
# from sklearn.cross_validation import train_test_split
# 在python新版本中,train_test_split被移动到model_selection中
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import numpy as np
import glob
import cv2 

# 定义一个RGB直方图的类和方法
class RGBHistogram:
    def __init__(self,bins):
        self.bins = bins
    # 定义对图片特征的描述为彩色直方图
    def describe(self,image,mask=None):
        # 计算三个通道的直方图
        hist=cv2.calcHist([image],[0,1,2],mask,self.bins,[0,256,0,256,0,256])
        # 直方图均一化,减少图片亮度和对比度信息的干扰
        cv2.normalize(hist,hist)
        return hist.flatten()

# 加载所有的图片和蒙版
imagePath = "dataset/images"
maskPath  = "dataset/masks"
# 利用sorted函数实现名字的一一对应,对每个图片进行蒙版的加载
imagePaths = sorted(glob.glob(imagePath + "/*.png"))
maskPaths  = sorted(glob.glob(maskPath + "/*.png"))

# data保存彩色直方图信息,保存测试数据集的feature
data = []
# target保存图片名称的字符串信息,相当于测试数据的label
target = []

# 实例化一个计算RGB直方图的对象,类似于一个操作句柄
desc = RGBHistogram([8,8,8])

# 数据预处理,把照片信息转换成可训练的数据
for (imagePath,maskPath) in zip(imagePaths,maskPaths):
    # 读取照片和蒙版
    image = cv2.imread(imagePath)
    mask  = cv2.imread(maskPath)
    # 虽然蒙版已经是黑白的了,但要确保图片格式也是灰度表示的
    mask  = cv2.cvtColor(mask,cv2.COLOR_BGR2GRAY)
    # 计算直方图,返回的是均一化之后的彩色直方图数据
    features = desc.describe(image,mask)
    # 构造测试数据集的特征信息集合
    data.append(features)
    # 注意图片的命名格式为"image_crocus_0001.png",我们需要提取的"crocus"是倒数第二个
    target.append(imagePath.split("_")[-2])

# 这时候的target里面保存的是字符串,并不是具体的数值,还不能进行学习
# 对名字进行去重处理,注意target本身没变,targetNames是去重之后的标签名
targetNames = np.unique(target)
# 初始化一个打标签的对象
le = LabelEncoder()
# 对target进行数字化标签index(因为字符串这种特征是不能直接拿来训练的,需要转换成唯一的数值)
target = le.fit_transform(target)

######################### 至此,数据预处理已经全部完成 ##############################

# 对数据进行训练集和测试集的划分,划分比例是7:3
(trainData,testData,trainTarget,testTarget) = \
    train_test_split(data,target,test_size=0.3,random_state=42)

# 初始化一个随机森林分类器模型
model = RandomForestClassifier(n_estimators=25,random_state=84)
# 用训练集训练这个分类器模型
model.fit(trainData,trainTarget)

# 用测试集合评估分类器性能,并打印出来
print(classification_report(testTarget, model.predict(testData),\
                            target_names=targetNames))

######################### 至此,训练已经全部完成 ##############################

# 随机抽取10个案例进行测试
for i in np.random.choice(np.arange(0,len(imagePaths)),10):
    imagePath = imagePaths[i]
    maskPath  = maskPaths[i]
    image = cv2.imread(imagePath)
    mask  = cv2.imread(maskPath)
    mask  = cv2.cvtColor(mask,cv2.COLOR_BGR2GRAY)
    
    # 生成特征(彩色直方图)
    features = desc.describe(image,mask)
    # 预测输出,从数字index转换成对应的字符串标签
    flower = le.inverse_transform(model.predict([features]))[0]
    print(imagePath)
    print("According to RFT, this flower is {}".format(flower))
    cv2.imshow("predicted to be {}".format(flower.upper()),image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
cv2.destroyAllWindows()

学习器的性能如下

 				precision    recall  f1-score   support

      crocus       0.92      1.00      0.96        12
       daisy       0.88      0.93      0.90        15
       pansy       1.00      0.85      0.92        20
   sunflower       0.96      1.00      0.98        24

    accuracy                           0.94        71
   macro avg       0.94      0.95      0.94        71
weighted avg       0.95      0.94      0.94        71


预测输出效果:

在这里插入图片描述

深度学习花的分类识别 项目背景深度学习花的分类识别项目的背景是指利用深度学习技术对花朵进行自动分类和识别的项目。在传统的花卉分类识别中,通常需要人工进行观察和判断,这既费时又费力。而深度学习技术的出现,为花卉分类识别提供了一种快速、准确且自动化的解决方案。深度学习是一种模仿人类神经网络的计算模型,通过多层次的神经网络结构,可以从大量的数据中学习和提取特征,从而实现对复杂问题的解决。在花卉分类识别项目中,深度学习算法可以通过对大量花卉图像进行训练,学习到花卉的特征和模式,从而实现对花卉的自动分类和识别。 阅读详情

相关推荐

opencv计算植物叶面积_叶直径_叶周长_python_opencv 根据面积计算直径

利用python自带的opencv库来计算植物叶片的叶面积、叶直径和叶周长,拍摄图片就可以直接得到真实的叶面积、叶直径和叶周长。

2401_87373364的博客 885

毕设 深度学习花卉识别 - python 机器视觉 opencv

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是🚩深度学习花卉识别 - python 机器视觉 opencv🥇学长这里给一个题目综合评分(每项满分5分)难度系数:3分工作量:3分创新点:4分🧿。

HUXINY的博客 5145

Python OpenCV3 图像分类 - 使用 K-means 算法进行图像聚类

本文介绍了 K-means 算法在图像分类中的应用,并提供了 Python OpenCV3 实现代码。掌握该方法可以帮助我们更好地处理和理解大量的图像数据,具有广阔的应用前景。

. 1426

图像识别毕业设计 opencv实现植物识别算法系统 - python 深度学习

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是🚩基于深度学习的植物识别算法研究与实现🥇学长这里给一个题目综合评分(每项满分5分)难度系数:4分工作量:4分创新点:3分。

kooerr的博客 2294

opencv-python空白图上随机种植物

先在网上找个可以看的植物图片 然后我们使用ps功能将植物一个个裁剪下来。 先弄个5张图片出来测试一下 然后在ps里面生成一个白图,新建一个1080*720的 然后导出图片在桌面,当然你也可以直接用python代码生成一张白色图片 Img = 255 * np.ones((h, w, 3), dtype=np.uint8) # 生成全白的图片 然后我们需要做的就是将5给植物图片随机的种植在那张白图上面,效果如下: 那么直接来看代码吧 #5张植物图片和1张白色...

分享知识 930

opencv-python空白图上随机种植物2-保留png图像透明度

上一章节的随机种植植物存在一点小问题,就是当图片和图片直接重合的时候就会导致很突兀,比如下图,还是之前的代码,植物图片种植100个左右。 是不是内心中一万只xxx飞过。 我们来看下上一版本的代码 # 5张植物图片和1张白色背景图都放置在当前2文件夹下面 from PIL import Image import random # 读入5张图片 img1 = Image.open('./2/1.png') img2 = Image.open('./2/2.png') img3 = Image.o.

分享知识 894

Python OpenCV 显示图片,图片分类

1 def divide_image(path,g_path1,g_path0): 2 img_lst = os.listdir(path) 3 for i in img_lst: 4 print('类别1,类别0') 5 img = cv2.imread(os.path.join(path,i)) 6 ...

L99887766的博客 1149

基于Python与深度学习的农作物病虫害识别项目全流程解析

图像分类是计算机视觉领域的核心任务之一,旨在为输入图像分配一个预定义的类别标签。其基本原理是通过卷积神经网络(CNN)等深度学习模型,自动从海量图像数据中学习并提取具有判别性的特征。这项技术的价值在于能够将复杂的视觉模式识别问题自动化,极大地提升了信息处理的效率和规模。在工程实践中,图像分类技术已广泛应用于安防监控、医疗影像分析、工业质检以及智慧农业等多个场景。例如,在智慧农业领域,通过分析作物叶片图像实现病虫害的自动识别与分类,成为AI技术赋能传统产业的一个典型应用。本项目以农作物病虫害识别为具体案例,详

weixin_29045585的博客 261

opencv计算植物叶面积_叶直径_叶周长_python

利用python自带的opencv库来计算植物叶片的叶面积、叶直径和叶周长,拍摄图片就可以直接得到真实的叶面积、叶直径和叶周长。

HYSliuliuliu的博客 1万+

基于Python与百度AI的植物识别桌面应用开发实战

计算机视觉作为人工智能的核心分支,其原理在于让机器“看懂”图像内容。通过深度学习模型对海量图像数据进行训练,计算机能够学习并识别其中的物体特征。这项技术的核心价值在于将复杂的视觉信息转化为可处理的数据,极大地拓展了自动化应用的边界。在工程实践中,开发者无需从零构建模型,利用成熟的云服务API(如百度AI开放平台)即可快速集成图像识别能力,这大幅降低了技术门槛并提升了开发效率。其应用场景广泛,从工业质检到医疗影像分析,再到日常生活辅助工具。本文聚焦于一个具体的工程实践案例:结合Python编程语言、PyQt5

weixin_29038537的博客 259

基于Python与百度API的植物识别系统开发实战:从PyQt5界面到毕业设计实现

图像识别作为人工智能的核心应用领域,其原理是通过深度学习模型对图像特征进行提取与分类。这项技术为各行各业带来了显著的效率提升与自动化价值,尤其在植物分类、农业科技等场景中展现出广泛的应用潜力。本文聚焦于一个结合百度AI开放平台API与PyQt5图形界面的毕业设计项目,详细拆解了如何构建一个完整的植物识别桌面应用。项目涉及API申请与鉴权、图像预处理、网络请求处理以及GUI开发等关键技术环节,并深入探讨了代码组织、异常处理与项目打包等工程实践问题,为计算机及相关专业学生提供了一个难度适中、技术栈清晰且具备良好

weixin_42530793的博客 318

基于深度学习的植物图像识别系统-python

本项目是一个基于深度学习的植物图像识别系统,通过ONNX模型实现4066种植物分类(Top-1准确率84.8%)。系统支持GUI交互选图、结果可视化标注(显示物种/属/科分类)、批量识别和历史记录保存(JSON格式),同时提供无GUI控制台版本。采用Python3.13+ONNXRuntime+OpenCV技术栈,包含图像处理、模型推理和中文标注功能,适合作为编程入门实践项目。模型文件29.5MB,依赖主流深度学习库,已在Windows10+Anaconda环境下测试通过。(注:项目为教学用途,实际工作场景

wjwjwjd的博客 181

Python-opencv-植物叶片识别

Python-opencv-植物叶片识别

用Python+OpenCV给贵州常见植物做个‘身份证’:从茅栗到楮的自动识别实践

本文介绍了如何利用Python和OpenCV为贵州常见植物构建自动识别系统,涵盖从茅栗到楮的13种植物。通过计算机视觉技术提取叶片形态和花果特征,结合传统机器学习分类器,实现轻量化且可解释的植物识别方案。该系统适用于生态调查、科普教育等场景,在实地测试中平均准确率达83.5%。

weixin_31499265的博客 258

IP路由原理、静态路由及动态路由区分

什么是路由 路由是指导IP报文发送的路径信息。 直连路由:目的地所在网络与路由器直接相连。 间接路由:目的地所在网络与路由器非直接相连。 静态路由是由管理员手工配置而生成的路由。 动态路由路由器使用路由协议从其他路由器那里获悉的路由。

weixin_42227328的博客 5471

交叉熵损失函数基本概念及公式

对于二分类问题,模型的输出通常是一个标量,表示样本属于正类的概率。因此,在二分类的交叉熵损失函数中,我们只需要考虑一个概率值,即模型预测为正类的概率。具体来说,当真实标签为1时,我们关注模型预测为正类的概率;当真实标签为0时,我们关注模型预测为负类的概率。因此,二分类的交叉熵损失函数可以表示为:其中,y 表示真实标签,取值为 0 或 1;p 表示模型预测为正类的概率。而对于多分类问题,模型的输出通常是一个向量,表示样本属于各个类别的概率。因此,在多分类的交叉熵损失函数中,我们需要考虑所有类别的概率。

qlkaicx的博客 1万+

【Python项目】AI动物识别工具

利用OpenCV、yolov5技术, python技术、Django框架、B/S架构、MySQL数据库等技术来进行一次AI动物识别技术的开发应用。通过B/S结构来进行网站的搭建,通过Python技术来搭建WEB系统,在浏览器中即可完成对系统的内容操作。通过结合OpenCV以及YOLO5来进行图像识别模块的开发,使得整个系统的操作过程需要保证简单,用户可以快速的上手操作,实现图像识别的功能运行。

Dyan_csdn的博客 1657

2021-10-29 atcoder ABC157——B - Bingo

B - Bingo 先标记,然后暴力判断,这样最清晰最好想。 #include<iostream> #include<algorithm> #include<cstring> using namespace std; typedef long long LL; int a[110][110],b[110]; int main() { for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) cin>>a[i]

honeistbutter的博客 338

SUNFLOWER MATCH LAB植物匹配实验室一键部署教程:Python环境快速配置指南

本文介绍了如何在星图GPU平台上自动化部署🌻 SUNFLOWER MATCH LAB: 植物匹配实验室镜像,快速搭建植物识别与匹配的AI应用环境。用户通过该平台可一键启动服务,并利用其API接口,轻松实现上传植物图片、识别物种并匹配相似品种的核心功能,适用于园艺、农业研究等场景。

weixin_34885746的博客 224

补丁1.0:使用Eviews做ADF检验

补丁1.0:使用Eviews做ADF检验

Jet4505的博客 1961

芒果YOLO11改进137:卷积AKConv篇,即插即用,具有任意采样形状和任意数量的参数的卷积内核

卷积AKConv篇,即插即用,具有任意采样形状和任意数量的参数的卷积内核

包括YOLOv5、YOLOv7、YOLOv8等模型改进 297

SUNFLOWER MATCH LAB植物匹配实验室Python入门教程:3步搭建AI植物识别环境

本文介绍了如何在星图GPU平台上自动化部署“🌻 SUNFLOWER MATCH LAB: 植物匹配实验室”镜像,快速搭建AI植物识别开发环境。通过该平台,用户可轻松创建包含预装环境的GPU实例,并利用镜像内置工具,实现植物图像的自动化加载、预处理与可视化分析,为后续的智能识别研究奠定基础。

weixin_32389853的博客 83

撸毛笔记-电信营业厅 v5.03

电信营业厅 v5.03签到和完成部分金豆任务, 喂宠物7天,15天,28天连签抽奖, 宠物等级权益兑换自己设置电信的服务密码, 把 手机号#服务密码 填到变量里:每天运行一两次const $ = new Env("电信营业厅");

xiaoshun007的专栏 4497

用Python+PPBC图像库,手把手教你打造一个贵州常见树种识别小工具

本文详细介绍了如何利用Python和PPBC中国植物图像库开发一个贵州常见树种识别工具。从环境搭建、数据准备到图像处理、特征提取,再到机器学习模型构建和用户界面开发,手把手教你实现一个智能识别系统。通过随机森林和CNN模型的应用,结合Tkinter或Streamlit界面,最终完成一个实用的树种识别工具。

weixin_33182798的博客 307

税务某局 webpack 登录接口逆向分析

我们再回到接口逻辑去看一下,发现每次请求前,还有两个接口,getpublickey和sendsm4,这里分析了一下调用逻辑,sm4这个接口用到一个参数是由publickey返回的一个参数而来,这个参数又经过内部加密处理,我们找到这个参数加密的地方,大概是在这个位置。我们还是顺着逻辑将加载器扣下来,然后用一个变量去接收,有了加载器,我们直接把加密代码扣下来做下处理,把一些用到的参数整理下如下。打上断点分析后,_utils_getuuid这个很长的变量也是加载器的一个函数,我们将这段代码也扣下来,如下。

码王吴彦祖的博客 403

【Burp入门第二篇】Chrome配置BurpSuite代理教程

1、配置Burp代理为127.0.0.1:80802、扩展商店添加插件switchyomega,修改服务器和端口为下图:3、打开代理,选择刚才添加的代理

等风来 8368
上一篇: 使用OpenCV-python实现颜色特征跟踪视频中的物体
下一篇: Python链表学习
刘凯KAI
博客等级 码龄15年 663粉丝 128原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值