OpenCV核心内容100讲【第87讲】计算机视觉在农业技术中的应用

文摘   2024-12-17 07:07   天津  

欢迎单击如下公众号“计算机视觉之,关注我

87 计算机视觉在农业技术中的应用

计算机视觉技术正在迅速改变农业领域,它的应用涵盖从作物监测、中草药识别到害虫检测和田间自动化运作等多个方面。利用OpenCV和Python,我们可以开发众多农业图像处理应用,帮助农民更高效地进行作物管理,提高产量。

知识点与函数介绍

图像读取与显示

在农业技术中,图像读取与显示是最基础的操作,我们将会频繁使用这些功能来处理田间图片。

import cv2
cv2.imread()

  • 功能: 从文件中加载图像。
  • 参数:
    • filename (str): 图像文件名。
    • flags (int): 指定图像的读取方式,cv2.IMREAD_COLOR 表示加载彩色图像,cv2.IMREAD_GRAYSCALE 表示加载灰度图像。
  • 返回值: 返回一个图像对象。

示例:

image = cv2.imread('field.jpg', cv2.IMREAD_COLOR)

cv2.imshow()

  • 功能: 显示图像在窗口中。
  • 参数:
    • window_name (str): 窗口名称。
    • image (ndarray): 要显示的图像。
  • 返回值: 无。

示例:

cv2.imshow('Field', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

农作物疾病检测

病斑区域提取

cv2.inRange()

  • 功能: 根据给定的范围检测图像中的像素。
  • 参数:
    • src (ndarray): 输入图像。
    • lowerb (tuple): 下边界。
    • upperb (tuple): 上边界。
  • 返回值: 输出二值图像,指示范围内的像素。

示例:

lower_bound = (000)
upper_bound = (0100100)
mask = cv2.inRange(image, lower_bound, upper_bound)

例题:探测叶片病斑区域

1. 加载图像

import cv2

image = cv2.imread('leaf.jpg')

2. 转换为HSV颜色空间

hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

3. 定义病斑颜色范围并创建掩模

枯叶基本在“橙色、黄色”范围内,紧邻绿色。

hsv的范围大致在:

  • H∈[25,100],[10,35],具体范围取决于枯叶本身枯萎程度等情况。
  • S∈[40,255]
  • V∈[40,255]

注意:是大概。这里是仅仅基于颜色的选取,因此本程序就是一个玩具。距离实用还有十万八千里。仅仅提供了一个解决问题的思路而已。实践中,可以考虑使用深度学习方式。

lower_bound = (254040)
upper_bound = (100255255)
mask = cv2.inRange(hsv_image, lower_bound, upper_bound)

4. 检测病斑并显示结果

result = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow('Disease Area', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

完整的程序代码:

# -*- coding: utf-8 -*-
"""
Created on Sun May 26 08:35:32 2024

@author: 李立宗,公众号:计算机视觉之光
"""


import cv2

# 1. 加载图像
image = cv2.imread('c.jpg')
cv2.imshow('leaf', image)

# 2. 转换为HSV颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 3. 定义病斑颜色范围并创建掩模
lower_bound = (204040)
upper_bound = (22255255)
mask = cv2.inRange(hsv_image, lower_bound, upper_bound)

# 4. 检测病斑并显示结果
result = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow('Disease Area', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

轮廓
import cv2
import numpy as np

# 1. 加载图像
image = cv2.imread('leaf.jpg')

# 2. 转换为HSV颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 3. 定义病斑颜色范围并创建掩模
lower_bound = (104040)
upper_bound = (35255255)

mask = cv2.inRange(hsv_image, lower_bound, upper_bound)

# 4. 使用掩模进行形态学操作,去除噪声并填补区域
kernel = np.ones((3,3), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)

# 5. 查找病斑轮廓
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 6. 计算轮廓面积并保留面积最大的10%个轮廓
contour_areas = [(cnt, cv2.contourArea(cnt)) for cnt in contours]
contour_areas.sort(key=lambda x: x[1], reverse=True)
num_to_keep = max(1, len(contour_areas) // 50)  # 保留最大的【百分比控制】的轮廓,至少保留1个
top_contours = [item[0for item in contour_areas[:num_to_keep]]

# 7. 绘制保留下来的轮廓到图像上
contour_image = image.copy()
cv2.drawContours(contour_image, top_contours, -1, (00255), 2)  # 红色曲线

# 8. 显示结果
cv2.imshow('Disease Area Contour', contour_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

程序输出:

【说明】以上都是玩具,如果要想识别精准,还是需要使用深度学习才行。

农作物种类识别

特征检测

cv2.ORB_create()

  • 功能: 创建ORB检测器。
  • 参数: 检测器参数配置。
  • 返回值: ORB检测器对象。

orb.detectAndCompute()

  • 功能: 检测关键点和计算描述子。
  • 参数:
    • image (ndarray): 输入图像。
    • mask (optional): 掩模图像。
  • 返回值: 关键点和描述子。

示例:

orb = cv2.ORB_create()
keypoints, descriptors = orb.detectAndCompute(image, None)

匹配特征

cv2.BFMatcher()

  • 功能: 创建暴力匹配器。
  • 参数:
    • normType (int): 距离度量方式。
    • crossCheck (bool): 是否启用交叉检查。
  • 返回值: 匹配器对象。

matcher.match()

  • 功能: 匹配描述子。
  • 参数:
    • descriptors1 (ndarray): 第一组描述子。
    • descriptors2 (ndarray): 第二组描述子。
  • 返回值: 匹配结果。

示例:

bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(descriptors1, descriptors2)

例题:匹配农作物图像

1. 加载两幅图像

import cv2

image1 = cv2.imread('crop1.jpg', cv2.IMREAD_GRAYSCALE)
image2 = cv2.imread('crop2.jpg', cv2.IMREAD_GRAYSCALE)

2. 检测和计算ORB特征

orb = cv2.ORB_create()
keypoints1, descriptors1 = orb.detectAndCompute(image1, None)
keypoints2, descriptors2 = orb.detectAndCompute(image2, None)

3. 进行特征匹配

bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(descriptors1, descriptors2)
matches = sorted(matches, key=lambda x: x.distance)

4. 绘制匹配结果

matched_image = cv2.drawMatches(image1, keypoints1, image2, keypoints2, matches[:10], None)
cv2.imshow('Matches', matched_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

完整的程序代码:

import cv2

# 1. 加载两幅图像
image1 = cv2.imread('crop1.jpg', cv2.IMREAD_GRAYSCALE)
image2 = cv2.imread('crop2.jpg', cv2.IMREAD_GRAYSCALE)

# 2. 检测和计算ORB特征
orb = cv2.ORB_create()
keypoints1, descriptors1 = orb.detectAndCompute(image1, None)
keypoints2, descriptors2 = orb.detectAndCompute(image2, None)

# 3. 进行特征匹配
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(descriptors1, descriptors2)
matches = sorted(matches, key=lambda x: x.distance)

# 4. 绘制匹配结果
matched_image = cv2.drawMatches(image1, keypoints1, image2, keypoints2, matches[:10], None)
cv2.imshow('Matches', matched_image)
cv2.waitKey(0)
cv2.destroyAllWindows()




农业机器人视觉导航

图像矫正与变换

cv2.getPerspectiveTransform()

  • 功能: 获取透视变换矩阵。
  • 参数:
    • src (ndarray): 源点数组。
    • dst (ndarray): 目标点数组。
  • 返回值: 透视变换矩阵。

cv2.warpPerspective()

  • 功能: 应用透视变换。
  • 参数:
    • src (ndarray): 输入图像。
    • M (ndarray): 变换矩阵。
    • dsize (tuple): 输出图像大小。
  • 返回值: 变换后的图像。

示例:

M = cv2.getPerspectiveTransform(src_points, dst_points)
warped_image = cv2.warpPerspective(image, M, (width, height))

例题:田间路径矫正

1. 加载图像

import cv2

image = cv2.imread('field_path.jpg')

2. 定义源点和目标点

src_points = np.float32([[100200], [400200], [100500], [400500]])
dst_points = np.float32([[00], [3000], [0300], [300300]])

3. 计算透视变换矩阵

M = cv2.getPerspectiveTransform(src_points, dst_points)

4. 应用透视变换

warped_path = cv2.warpPerspective(image, M, (300300))
cv2.imshow('Corrected Path', warped_path)
cv2.waitKey(0)
cv2.destroyAllWindows()

完整的程序代码:

import cv2
import numpy as np

# 1. 加载图像
image = cv2.imread('earth.jpg')
cv2.imshow('image', image)

# 2. 定义源点和目标点
src_points = np.float32([[32040], [42050], [40300], [460320]])
dst_points = np.float32([[00], [3000], [0600], [300600]])

# 3. 计算透视变换矩阵
M = cv2.getPerspectiveTransform(src_points, dst_points)

# 4. 应用透视变换
warped_path = cv2.warpPerspective(image, M, (300600))
cv2.imshow('Corrected', warped_path)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

远端有些失真。

通过本节的学习,我们了解了计算机视觉技术在农业中的应用,从基础的图像读取与显示到更高级的病斑检测、农作物类别识别和农业机器人视觉导航。尝试这些实践示例不仅能加深对OpenCV函数的理解,还能启发在实际农业应用中的创新思维。从病斑检测到路径规划,计算机视觉正在并将继续革命化农业生产方式,提高工作效率和产量。



这里简单介绍了一些基本知识点,更细致的内容请参考:

  • 李立宗,OpenCV轻松入门(第2版),电子工业出版社,2023

  • 李立宗,计算机视觉40例(从入门到深度学习:OpenCV-Python),电子工业出版社,2022


在公众号【计算机视觉之光】回复 【OpenCV模拟试卷】获得《数字图像处理(OpenCV-Python》模拟试卷及参考答案。
在公众号【计算机视觉之光】回复 【Python试卷】获得《Python程序设计》模拟试卷及参考答案。

单击【阅读原文】参加OpenCV-Python课程学习。

在本公众号【计算机视觉之光】回复关键字“叮叮当当”获取更多的Python学习资料。

欢迎单击如下公众号“计算机视觉之光”,关注我




计算机视觉之光
电子工业出版社优秀作者,代表作《OpenCV轻松入门》,《计算机视觉40例》。
 最新文章