互聯網+智慧農業:計算機視覺技術在農作物病蟲害檢測方面的應用

農作物病蟲害是我國的主要農業災害之一,它具有種類多、影響大、並時常暴發成災的特點,其發生範圍和嚴重程度對我國國民經濟、特別是農業生產常造成重大損失。

隨着計算機科學技術的飛速發展,現已有非常多的 AI 方法手段應用於病蟲害目標檢測、防治,進而運用現代技術助力贈產脫貧!

本文將從計算機視覺技術出發,運用Python語言簡要分析目標檢測農作物病蟲害方面的研究與應用。

目錄

1 項目簡介

1.1 項目概述

1.2 前期準備

2 項目分析

2.1 代碼詳解

2.2 總觀代碼

2.3 項目運行結果

3 總結展望


1 項目簡介

1.1 項目概述

本項目旨在運用Python語言分析和闡述計算機視覺技術中的目標檢測在農作物病蟲害方面的應用。具體而言,我們將運用Python語言運行並得出目標葉面中已遭受病蟲害的面積,然後分析是否需要進行農藥噴灑等防治病蟲害的進一步肆虐,進而幫助農名伯伯更好地管理農作物,減少損失、增加產量……

1.2 前期準備

首先,尋找檢測目標:這裏我們針對一片部分遭受病蟲害的葉片進行檢測處理

對葉片分析處理用到python語言及部分第三方庫

在這裏:
Python環境:3.8.2

python編譯器:JetBrains PyCharm 2018.1.2 x64

第三方庫:OpenCV、ilmutils、easygui、numpy、PIL

2 項目分析

2.1 代碼詳解

導入用到的所有庫

import cv2
import imutils
import easygui
from PIL import Image, ImageDraw, ImageFont
import numpy as np

事先將有病蟲害的葉片部分做畫圖處理(塗成白色) 背景圖


導入圖片並做黑白處理

# foliageNew 作爲背景圖,是人爲事先在葉子有病蟲害的地方用畫筆塗改爲白色的圖片,讀取它
PSpicture = cv2.imread(r"E:\foliageNew.png")
# 將圖片 foliageNew 轉換爲黑白圖像
PSpicture = cv2.cvtColor(PSpicture, cv2.COLOR_BGR2GRAY)

 

對背景圖再做高斯處理 

# 對圖片 foliageNew 進行高斯處理
PSpictureGS = cv2.GaussianBlur(PSpicture, (21, 21), 0)

 

同時事先將目標檢測葉片同樣做畫圖處理(塗成白色) 

對其做相同處理

# foliageWhite 是葉子目標檢測圖,讀取它
originalPicture = cv2.imread(r"E:\foliageWhite.png")
# 將圖片 foliageWhite 轉換爲黑白圖像
originalPicture = cv2.cvtColor(originalPicture, cv2.COLOR_BGR2GRAY)
# 對圖片 foliageWhite 進行高斯處理
originalPictureGS = cv2.GaussianBlur(originalPicture, (21, 21), 0)

 

對兩張處理後的圖片做差,返回的值代表其差異之處 

# 對圖片 foliageNew 和 foliageWhite 做差(對比),返回的結果代表他們的差異之處
pictureDelta = cv2.absdiff(PSpictureGS, originalPictureGS)

 

因爲之後要用到相關數據,所以事先查看圖片像素大小

# x, y 是圖片的像素大小
x, y = pictureDelta.shape
print(x, y)

 此值與圖片屬性中所示的值相同,這也正是我們期望的結果

當然,這裏我們可以做一下邊緣檢測進一步確認我們想要的檢測目標區域

# pictureDelta 是圖像的區域,canny 是圖像的輪廓(白色區域)
img = cv2.GaussianBlur(pictureDelta, (3, 3), 0)
# Canny 邊緣檢測
canny = cv2.Canny(img, 0, 100)

 

確定目標檢測區域(這裏是輪廓區域,不是整個圖像區域)
即在第二次做高斯處理的那個圖像上確定檢測區域(像素值爲白的區域就是我們想要的目標區域)

# 畫輪廓,存儲要識別的像素值的位置,記錄在 distinguishLeaf 數組中
for i in range(x):
    for j in range(y):
        if any(originalPicture[i, j] == [255, 255, 255]):  # 顏色爲白色的時候,佔位
            distinguishLeaf.append([i, j])

遍歷上述得出的目標區域(已存入數組中,接下來也就是對數組進行操作)
其中LeafArea是目標檢測葉面的面積(多個像素點的累積值)
       greenLeafArea是目標葉面中綠色部分的面積(多個像素點的累積值)
因爲之前做過灰度處理(‘img’圖像),故這裏只需查看該像素點值是否爲黑(即值是否等於0)

很易得出,非黑色部分爲葉片綠色部分,因此一旦確定非黑,像素點個數 +1

for t in distinguishLeaf:
    k, l = t
    LeafArea = LeafArea + 1
    if img[k, l] != 0:
        # print(canny0[k, l])
        greenLeafArea += 1

 至此,成功了一大半,接下來要做的就是輸出病蟲害葉面佔的比重值

scale = 100 - (greenLeafArea/LeafArea)*100
percentage = "病蟲害葉面佔比爲:" + str(scale) + ' %'
print(percentage)

當然,我們可以進一步體現一下:若病蟲害葉面遭受病蟲害達到某一值,及時提醒農名伯伯噴灑農藥進行防治。

if scale < 95:
    easygui.msgbox('警告!葉片遭受病蟲害!請儘早噴灑農藥!')

 

這裏再贅述一點,就是可以輸出運行代碼中每一步的圖像處理結果,就像這樣

cv2.imwrite("這裏是存入本地圖片地址", 這裏是要輸出哪一步圖片的代碼名稱)
canny0 = cv2.imread("這裏是存入本地圖片地址")
cv2.imshow('這裏是圖像標題名稱', imutils.resize(canny0))

2.2 總觀代碼

# 導庫
import cv2
import imutils
import easygui
from PIL import Image, ImageDraw, ImageFont
import numpy as np

# foliageNew 作爲背景圖,是人爲事先在葉子有病蟲害的地方用畫筆塗改爲白色的圖片,讀取它
PSpicture = cv2.imread(r"E:\foliageNew.png")
# 將圖片 foliageNew 轉換爲黑白圖像
PSpicture = cv2.cvtColor(PSpicture, cv2.COLOR_BGR2GRAY)
# 對圖片 foliageNew 進行高斯處理
PSpictureGS = cv2.GaussianBlur(PSpicture, (21, 21), 0)
# foliageWhite 是葉子目標檢測圖,讀取它
originalPicture = cv2.imread(r"E:\foliageWhite.png")
# 將圖片 foliageWhite 轉換爲黑白圖像
originalPicture = cv2.cvtColor(originalPicture, cv2.COLOR_BGR2GRAY)
# 對圖片 foliageWhite 進行高斯處理
originalPictureGS = cv2.GaussianBlur(originalPicture, (21, 21), 0)
# 對圖片 foliageNew 和 foliageWhite 做差(對比),返回的結果代表他們的差異之處
pictureDelta = cv2.absdiff(PSpictureGS, originalPictureGS)
# x, y 是圖片的像素大小
x, y = pictureDelta.shape
# print(x, y)

# pictureDelta 是圖像的區域,canny 是圖像的輪廓(白色區域)
img = cv2.GaussianBlur(pictureDelta, (3, 3), 0)
# Canny 邊緣檢測
canny = cv2.Canny(img, 0, 100)

# 定義輪廓(一片葉子)總面積
LeafArea = 0
# 定義綠葉(未被病蟲害葉面)的面積
greenLeafArea = 0
# 定義列表,用來存放要識別的像素點的位置
distinguishLeaf = []

# 畫輪廓,存儲要識別的像素值的位置,記錄在 distinguishLeaf 數組中
for i in range(x):
    for j in range(y):
        if any(originalPicture[i, j] == [255, 255, 255]):  # 顏色爲白色的時候,佔位
            distinguishLeaf.append([i, j])

canny0 = cv2.add(originalPictureGS, canny)

# 判斷葉面顏色
for t in distinguishLeaf:
    k, l = t
    LeafArea = LeafArea + 1
    if img[k, l] != 0:
        # print(canny0[k, l])
        greenLeafArea += 1

# 統計綠葉佔比
scale = 100 - (greenLeafArea/LeafArea)*100
percentage = "病蟲害葉面佔比爲:" + str(scale) + ' %'
print(percentage)

# cv2.imwrite("這裏是存入本地圖片地址", 這裏是要輸出哪一步圖片的代碼名稱)
# canny0 = cv2.imread("這裏是存入本地圖片地址")
# cv2.imshow('這裏是圖像標題名稱', imutils.resize(canny0))

if scale < 95:
    easygui.msgbox('警告!葉片遭受病蟲害!請儘早噴灑農藥!')

# 此行代碼用於避免輸出圖片發生閃退的現象
key = cv2.waitKey(0)

2.3 項目運行結果

 

3 總結展望

從上述運行結果來看,該片葉子已經被病蟲害病害了越葉面面積的17%。此值已超過最小病害初定值,故最後彈出窗口顯示“警告!葉片遭受病蟲害!請儘早噴灑農藥!”

此項目運用簡單實例,介紹了計算機視覺技術在農業方面的應用,在幫助農民贈產脫貧方面起到了一定的作用。

這就是“互聯網+智慧農業”的實例項目實現。


版權聲明:本專欄全部爲CSDN博主「IT_change」的原創文章,遵循 CC 4.0 BY-SA 版權協議。
                  轉載請附上原文出處鏈接及本聲明。

感謝閱讀 ! 感謝支持 !  感謝關注 !

希望本文能對讀者學習和理解計算機視覺技術有所幫助,並請讀者批評指正!

2020年5月底于山西大同

END

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章