使用图像处理技术和卷积神经网络(CNN)的作物病害检测

 
 

点击上方“小白学视觉”,选择加"星标"或“置顶

 
 
重磅干货,第一时间送达

babc74acccdf8c0d94e77e77fe27e111.png

在这里,我们将讨论使用 OpenCV 图像处理技术进行作物疾病严重程度检测。这个过程不涉及任何训练部分。基于颜色分割技术,我们只提取更健康的植物区域。并根据总植物面积与更健康的区域计算疾病严重程度。

为此,我使用了一些马铃薯植物图像

基于图像分割的植物病害严重程度计算。

4271ae540af52dd69633c5a0d41ab5b2.png

什么是 OpenCV?

OpenCV 是用于执行机器学习和计算机视觉任务的图像处理软件工具或库。该库带有一组内置脚本来执行图像分析、图像检测等。该工具主要应用于对象跟踪、图像分析、图像处理、人脸识别等

什么是 HSV 颜色?

H - 色调,是颜色成分(基础颜色),范围 0-180    S -  饱和度,是颜色深度的大小,范围 0-255    V -  颜色的亮度,范围 0-255

6f6751fcd95731266d0d8b65b05317e3.pngd6d81d1b3f4a8b05243ab13606f9da98.png

HSV 是一种颜色格式,如 RGB。该图显示了 HSV 的颜色图。与 RGB 相比,它很容易从 HSV 中的图像中提取所需的颜色区域。HSV 图像不受光照或气候变化的影响。

形态学操作

形态变换或操作是对图像执行的一些简单操作,以在图像内进行一些形态变化。此操作在单通道图像上执行。该操作需要 2 个输入进行处理,一个是二进制图像,另一个是称为 kernel 的结构元素。为了执行这个操作,一个已知大小的内核被用来对图像进行卷积。操作类型一般取决于我们使用的内核类型。腐蚀和膨胀是两个基本的形态学运算。在这个项目中,我们使用了形态学开运算。

腐蚀

腐蚀是对图像执行的一种形态学操作。这种操作的基本直觉是它使用内核腐蚀图像。图像被腐蚀后,去除了噪声,但是也压缩了图像。

此操作的输入是包含值 0 或 1 的二进制图像。已知大小的内核会在图像上滑动。在此操作期间,如果内核的所有像素均为 1,则内核下的原始图像的像素将被视为 1,否则将被腐蚀(变为零)。此过程用于从图像中去除小点像素(噪声)。

06758c495ee585ef7768dd68c3447c83.png

膨胀

膨胀是一种形态学操作,但与对图像执行的腐蚀相反。这也将二进制图像作为输入。在此操作中,仅当内核至少一个像素为 1 时,原始图像的像素才会被视为 1。此操作扩大了白色区域,而腐蚀操作缩小了白色区域。

ffc430a5d1dddc2274fc36a02039e206.png

这些操作的组合有助于消除不需要的噪音。侵蚀从图像中去除白点;它基本上是噪声,但是图像中存在的对象会缩小。因此,我们使用膨胀操作对其进行膨胀以将其重塑为原始形状。

形态学开运算

当在膨胀之前进行腐蚀运算时,这个过程称为形态学开运算。

所提出的图像分割算法使用 OpenCV(图像处理软件工具)来执行任务。该算法由三个步骤组成,即颜色分割、形态学操作和严重程度计算。

97315c1d7474079796c970d76f1eeb21.png

植物病害严重程度是使用 python 中的图像处理技术计算的。

计算步骤如下:

1.加载图片

使用的图像是从互联网上下载的。使用 cv2.imread 加载图像并将其大小调整为 250x250x3

2.将BGR图像转换为HSV图像

3.提取健康区域(绿色像素)

将原始图像掩蔽到 HSV 范围以提取健康区域(H:38–86,S:0-255,V:0–255)

4.应用形态学运算

OpenCV 中的形态学开运算是先腐蚀后膨胀的组合。完成此操作是为了从图像中移除不需要的点像素(噪点)

5.提取植物区域

使用 HSV 范围屏蔽图像以提取整个植物区域 (H:26–86, S: 0–255, V:0–255)

:HSV值可根据要求更改

deec931d04ab6d469be4770e7866fb91.png

图:a-实际图像、b-hsv 图像、c-植物区域、d-植物健康区域、植物区域的 e-binary 图像、f-植物健康区域的二进制图像

00a3652a2adced5b539ff6604454b80e.png

图:a-实际图像、b-hsv 图像、c-植物区域、d-植物健康区域、植物区域的 e-binary 图像、f-植物健康区域的二进制图像

6. 计算疾病严重程度

疾病严重程度是使用计算的,

d5f49900444448f8c65e31e0fd99f670.png

S= 疾病严重程度((0-1)0-低,1-高)

HR=植物健康区面积

PR=整个植物区域的面积

import cv2, time
import numpy as np # numeraical
start = time.time() # to calculate the run tie required
img = cv2.imread("path/to/image file) # image reading
img=cv2.resize(img,(250,250)) # image resizing
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) # Converting it to hue saturation value image
range1=(26,0,0)
range2=(86,255,255)
mask1=cv2.inRange(hsv,range1,range2)
#apply morphological operations
kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)) # create structuring element
mask2 = cv2.morphologyEx(mask1, cv2.MORPH_OPEN, kernel1) # Apply mask to images 
mask2 = cv2.morphologyEx(mask1, cv2.MORPH_CLOSE, kernel1) # Apply morphological 
# open and close function
res=cv2.bitwise_and(img,img,mask=mask2) # these are done to display images
range1, range2 = (38,0,0), (86,255,255)
mask = cv2.inRange(hsv,range1,range2)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7,7))
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
t=mask
mask = cv2.merge([mask,mask,mask])
mask_inv = 255 - mask
white = np.full_like(img, (255,255,255))
img_masked = cv2.bitwise_and(img, mask)
white_masked = cv2.bitwise_and(white, mask_inv)
result = cv2.add(img_masked, mask_inv)
cv2.imwrite("green_plant_mask.png", t)
cv2.imwrite("green_plant_white_background.jpg", result)
cv2.imwrite("plant_region.jpg", res)
cv2.imwrite("binary.jpg",mask1)
cv2.imwrite("hsv_image.jpg",hsv)
x=cv2.countNonZero(t)
y=cv2.countNonZero(mask2)
print(x,y)
print("severity of disease is {}".format(1-(x/y)))
end = time.time() # to stop the time and to calculate runtime
print(f"Runtime of the program is {end - start} seconds")
cv2.imshow("img",img)# to display original image
cv2.imshow("binary", mask1) # to display binary image
cv2.imshow("hsv", hsv) # to display hsv image
cv2.imshow("result", result) # to display finalimage
# cv2.imshow("res",res)
# cv2.imshow("t",t)
cv2.waitKey(0)
cv2.destroyAllWindows()

bfa1c6f398c09dd789004b68229b28d6.png

使用 opencv 图像处理技术对植物疾病严重程度的量化在计算植物感染水平方面表现良好。该算法能够计算任何植物的疾病严重程度。

下图显示了三种不同的开发技术的输出结果。拍摄健康、轻度感染和高度感染的植物图像以测试该算法。这 3 幅图像的疾病严重程度分别计算为0.04、0.22和0.98。对于更健康的植物,4% 的严重程度是可以接受的,这可能是由于一些光照变化。

5e1b3d6cb79450127dbafec76e065163.png

对这项技术的评估是通过将输出结果与实际输入图像可视化。该算法能够通过应用形态学和颜色分割过程来计算植物的疾病严重程度。该算法的输出范围为0到1。

所开发的技术在本地机器以及树莓派模型中进行了测试。两种情况下的运行时间均小于0.1秒。因此,这项技术将更有效地用于植物的瞬时严重性计算和更精确地对不健康的植物应用农药。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值