新聞中心

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

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

        作者: 時間:2022-04-21 來源:CSDN 收藏
        編者按:農作物病蟲害是我國的主要農業災害之一,它具有種類多、影響大、并時常暴發成災的特點,其發生范圍和嚴重程度對我國國民經濟、特別是農業生產常造成重大損失。 隨著計算機科學技術的飛速發展,現已有非常多的 AI 方法手段應用于病蟲害目標檢測、防治,進而運用現代技術助力贈產脫貧! 本文將從計算機視覺技術出發,運用Python語言簡要分析目標檢測在農作物病蟲害方面的研究與應用。

        1 項目簡介

        本文引用地址:http://www.104case.com/article/202204/433328.htm

        1.1 項目概述

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

        1.2 前期準備

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

        1650511265257061.png

        對葉片分析處理用到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

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

        1650511333400882.png

        導入圖片并做黑白處理

        # foliageNew 作為背景圖,是人為事先在葉子有病蟲害的地方用畫筆涂改為白色的圖片,讀取它

        PSpicture = cv2.imread(r"E:foliageNew.png")

        # 將圖片 foliageNew 轉換為黑白圖像

        PSpicture = cv2.cvtColor(PSpicture, cv2.COLOR_BGR2GRAY)

        1650511393500991.png

        對背景圖再做高斯處理 

        # 對圖片 foliageNew 進行高斯處理

        PSpictureGS = cv2.GaussianBlur(PSpicture, (21, 21), 0)

        1650511459757911.png

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

        1650511494784905.png

        對其做相同處理

        # foliageWhite 是葉子目標檢測圖,讀取它

        originalPicture = cv2.imread(r"E:foliageWhite.png")

        # 將圖片 foliageWhite 轉換為黑白圖像

        originalPicture = cv2.cvtColor(originalPicture, cv2.COLOR_BGR2GRAY)

        # 對圖片 foliageWhite 進行高斯處理

        originalPictureGS = cv2.GaussianBlur(originalPicture, (21, 21), 0)

         

        1650511537827471.png

        1650511545434223.png

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

        # 對圖片 foliageNew 和 foliageWhite 做差(對比),返回的結果代表他們的差異之處

        pictureDelta = cv2.absdiff(PSpictureGS, originalPictureGS)

        1650511586853831.png

        1650517713795775.png

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

        # x, y 是圖片的像素大小

        x, y = pictureDelta.shape

        print(x, y)

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

        1650517733321360.png

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

        # pictureDelta 是圖像的區域,canny 是圖像的輪廓(白色區域)

        img = cv2.GaussianBlur(pictureDelta, (3, 3), 0)

        # Canny 邊緣檢測

        canny = cv2.Canny(img, 0, 100)

        1650517781756910.png

        確定目標檢測區域(這里是輪廓區域,不是整個圖像區域)

        即在第二次做高斯處理的那個圖像上確定檢測區域(像素值為白的區域就是我們想要的目標區域)

        # 畫輪廓,存儲要識別的像素值的位置,記錄在 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)

        1650517827225455.png

        很易得出,非黑色部分為葉片綠色部分,因此一旦確定非黑,像素點個數 +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('警告!葉片遭受病蟲害!請盡早噴灑農藥!')

         

        1650517879972211.png

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

        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 項目運行結果

        1650517961342819.png

        1650517966687965.png

        3 總結展望

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

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

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


        版權聲明:本專欄全部為CSDN博主「IT_change」的原創文章,遵循 CC 4.0 BY-SA 版權協議。

                          轉載請附上原文出處鏈接及本聲明。

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

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

        2020年5月底于山西大同

        END

        ————————————————

        版權聲明:本文為CSDN博主「榮仔!最靚的仔!」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

        原文鏈接:https://blog.csdn.net/IT_charge/article/details/106340456



        關鍵詞: 智慧農業

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 林甸县| 洛隆县| 五河县| 台州市| 安庆市| 正宁县| 图木舒克市| 竹北市| 海口市| 顺义区| 宜丰县| 桂林市| 汉沽区| 交城县| 教育| 洮南市| 辉南县| 舒兰市| 孟连| 奉节县| 枣阳市| 大丰市| 定西市| 德保县| 如皋市| 阿瓦提县| 凤庆县| 万盛区| 磐石市| 九寨沟县| 杭锦旗| 平果县| 乌鲁木齐县| 溆浦县| 丘北县| 刚察县| 民和| 汽车| 呼和浩特市| 甘肃省| 林西县|