欢迎单击如下公众号“计算机视觉之光”,关注我们。
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 = (0, 0, 0)
upper_bound = (0, 100, 100)
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 = (25, 40, 40)
upper_bound = (100, 255, 255)
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 = (20, 40, 40)
upper_bound = (22, 255, 255)
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 = (10, 40, 40)
upper_bound = (35, 255, 255)
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[0] for item in contour_areas[:num_to_keep]]
# 7. 绘制保留下来的轮廓到图像上
contour_image = image.copy()
cv2.drawContours(contour_image, top_contours, -1, (0, 0, 255), 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([[100, 200], [400, 200], [100, 500], [400, 500]])
dst_points = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])
3. 计算透视变换矩阵
M = cv2.getPerspectiveTransform(src_points, dst_points)
4. 应用透视变换
warped_path = cv2.warpPerspective(image, M, (300, 300))
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([[320, 40], [420, 50], [40, 300], [460, 320]])
dst_points = np.float32([[0, 0], [300, 0], [0, 600], [300, 600]])
# 3. 计算透视变换矩阵
M = cv2.getPerspectiveTransform(src_points, dst_points)
# 4. 应用透视变换
warped_path = cv2.warpPerspective(image, M, (300, 600))
cv2.imshow('Corrected', warped_path)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如下:
远端有些失真。
通过本节的学习,我们了解了计算机视觉技术在农业中的应用,从基础的图像读取与显示到更高级的病斑检测、农作物类别识别和农业机器人视觉导航。尝试这些实践示例不仅能加深对OpenCV函数的理解,还能启发在实际农业应用中的创新思维。从病斑检测到路径规划,计算机视觉正在并将继续革命化农业生产方式,提高工作效率和产量。
这里简单介绍了一些基本知识点,更细致的内容请参考:
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 = (0, 0, 0)
upper_bound = (0, 100, 100)
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 = (25, 40, 40)
upper_bound = (100, 255, 255)
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 = (20, 40, 40)
upper_bound = (22, 255, 255)
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 = (10, 40, 40)
upper_bound = (35, 255, 255)
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[0] for item in contour_areas[:num_to_keep]]
# 7. 绘制保留下来的轮廓到图像上
contour_image = image.copy()
cv2.drawContours(contour_image, top_contours, -1, (0, 0, 255), 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([[100, 200], [400, 200], [100, 500], [400, 500]])
dst_points = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])
3. 计算透视变换矩阵
M = cv2.getPerspectiveTransform(src_points, dst_points)
4. 应用透视变换
warped_path = cv2.warpPerspective(image, M, (300, 300))
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([[320, 40], [420, 50], [40, 300], [460, 320]])
dst_points = np.float32([[0, 0], [300, 0], [0, 600], [300, 600]])
# 3. 计算透视变换矩阵
M = cv2.getPerspectiveTransform(src_points, dst_points)
# 4. 应用透视变换
warped_path = cv2.warpPerspective(image, M, (300, 600))
cv2.imshow('Corrected', warped_path)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如下:
远端有些失真。
通过本节的学习,我们了解了计算机视觉技术在农业中的应用,从基础的图像读取与显示到更高级的病斑检测、农作物类别识别和农业机器人视觉导航。尝试这些实践示例不仅能加深对OpenCV函数的理解,还能启发在实际农业应用中的创新思维。从病斑检测到路径规划,计算机视觉正在并将继续革命化农业生产方式,提高工作效率和产量。
这里简单介绍了一些基本知识点,更细致的内容请参考:
李立宗,OpenCV轻松入门(第2版),电子工业出版社,2023
李立宗,计算机视觉40例(从入门到深度学习:OpenCV-Python),电子工业出版社,2022
单击【阅读原文】参加OpenCV-Python课程学习。
单击【阅读原文】参加OpenCV-Python课程学习。
在本公众号【计算机视觉之光】回复关键字“叮叮当当”获取更多的Python学习资料。