• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁(yè) > 智能計(jì)算 > 專題 > 互聯(lián)網(wǎng)+智慧農(nóng)業(yè):計(jì)算機(jī)視覺技術(shù)在農(nóng)作物病蟲害檢測(cè)方面的應(yīng)用

    互聯(lián)網(wǎng)+智慧農(nóng)業(yè):計(jì)算機(jī)視覺技術(shù)在農(nóng)作物病蟲害檢測(cè)方面的應(yīng)用

    作者: 時(shí)間:2022-04-21 來(lái)源:CSDN 收藏
    編者按:農(nóng)作物病蟲害是我國(guó)的主要農(nóng)業(yè)災(zāi)害之一,它具有種類多、影響大、并時(shí)常暴發(fā)成災(zāi)的特點(diǎn),其發(fā)生范圍和嚴(yán)重程度對(duì)我國(guó)國(guó)民經(jīng)濟(jì)、特別是農(nóng)業(yè)生產(chǎn)常造成重大損失。 隨著計(jì)算機(jī)科學(xué)技術(shù)的飛速發(fā)展,現(xiàn)已有非常多的 AI 方法手段應(yīng)用于病蟲害目標(biāo)檢測(cè)、防治,進(jìn)而運(yùn)用現(xiàn)代技術(shù)助力贈(zèng)產(chǎn)脫貧! 本文將從計(jì)算機(jī)視覺技術(shù)出發(fā),運(yùn)用Python語(yǔ)言簡(jiǎn)要分析目標(biāo)檢測(cè)在農(nóng)作物病蟲害方面的研究與應(yīng)用。

    1 項(xiàng)目簡(jiǎn)介

    1.1 項(xiàng)目概述

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

    1.2 前期準(zhǔn)備

    首先,尋找檢測(cè)目標(biāo):這里我們針對(duì)一片部分遭受病蟲害的葉片進(jìn)行檢測(cè)處理

    1650511265257061.png

    對(duì)葉片分析處理用到python語(yǔ)言及部分第三方庫(kù)

    在這里:

    Python環(huán)境:3.8.2

    python編譯器:JetBrains PyCharm 2018.1.2 x64

    第三方庫(kù):OpenCV、ilmutils、easygui、numpy、PIL等

    2 項(xiàng)目分析

    2.1 代碼詳解

    導(dǎo)入用到的所有庫(kù)

    import cv2

    import imutils

    import easygui

    from PIL import Image, ImageDraw, ImageFont

    import numpy as np

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

    1650511333400882.png

    導(dǎo)入圖片并做黑白處理

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

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

    # 將圖片 foliageNew 轉(zhuǎn)換為黑白圖像

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

    1650511393500991.png

    對(duì)背景圖再做高斯處理 

    # 對(duì)圖片 foliageNew 進(jìn)行高斯處理

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

    1650511459757911.png

    同時(shí)事先將目標(biāo)檢測(cè)葉片同樣做畫圖處理(涂成白色) 

    1650511494784905.png

    對(duì)其做相同處理

    # foliageWhite 是葉子目標(biāo)檢測(cè)圖,讀取它

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

    # 將圖片 foliageWhite 轉(zhuǎn)換為黑白圖像

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

    # 對(duì)圖片 foliageWhite 進(jìn)行高斯處理

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

     

    1650511537827471.png

    1650511545434223.png

    對(duì)兩張?zhí)幚砗蟮膱D片做差,返回的值代表其差異之處 

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

    pictureDelta = cv2.absdiff(PSpictureGS, originalPictureGS)

    1650511586853831.png

    1650517713795775.png

    因?yàn)橹笠玫较嚓P(guān)數(shù)據(jù),所以事先查看圖片像素大小

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

    x, y = pictureDelta.shape

    print(x, y)

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

    1650517733321360.png

    當(dāng)然,這里我們可以做一下邊緣檢測(cè)進(jìn)一步確認(rèn)我們想要的檢測(cè)目標(biāo)區(qū)域

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

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

    # Canny 邊緣檢測(cè)

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

    1650517781756910.png

    確定目標(biāo)檢測(cè)區(qū)域(這里是輪廓區(qū)域,不是整個(gè)圖像區(qū)域)

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

    # 畫輪廓,存儲(chǔ)要識(shí)別的像素值的位置,記錄在 distinguishLeaf 數(shù)組中

    for i in range(x):

        for j in range(y):

            if any(originalPicture[i, j] == [255, 255, 255]):  # 顏色為白色的時(shí)候,占位

                distinguishLeaf.append([i, j])


    遍歷上述得出的目標(biāo)區(qū)域(已存入數(shù)組中,接下來(lái)也就是對(duì)數(shù)組進(jìn)行操作)

    其中LeafArea是目標(biāo)檢測(cè)葉面的面積(多個(gè)像素點(diǎn)的累積值)

           greenLeafArea是目標(biāo)葉面中綠色部分的面積(多個(gè)像素點(diǎn)的累積值)

    因?yàn)橹白鲞^(guò)灰度處理(‘img’圖像),故這里只需查看該像素點(diǎn)值是否為黑(即值是否等于0)

    1650517827225455.png

    很易得出,非黑色部分為葉片綠色部分,因此一旦確定非黑,像素點(diǎn)個(gè)數(shù) +1

    for t in distinguishLeaf:

        k, l = t

        LeafArea = LeafArea + 1

        if img[k, l] != 0:

            # print(canny0[k, l])

            greenLeafArea += 1


     至此,成功了一大半,接下來(lái)要做的就是輸出病蟲害葉面占的比重值

    scale = 100 - (greenLeafArea/LeafArea)*100

    percentage = "病蟲害葉面占比為:" + str(scale) + ' %'

    print(percentage)


    當(dāng)然,我們可以進(jìn)一步體現(xiàn)一下:若病蟲害葉面遭受病蟲害達(dá)到某一值,及時(shí)提醒農(nóng)名伯伯噴灑農(nóng)藥進(jìn)行防治。

    if scale < 95:

        easygui.msgbox('警告!葉片遭受病蟲害!請(qǐng)盡早噴灑農(nóng)藥!')

     

    1650517879972211.png

    這里再贅述一點(diǎn),就是可以輸出運(yùn)行代碼中每一步的圖像處理結(jié)果,就像這樣

    cv2.imwrite("這里是存入本地圖片地址", 這里是要輸出哪一步圖片的代碼名稱)

    canny0 = cv2.imread("這里是存入本地圖片地址")

    cv2.imshow('這里是圖像標(biāo)題名稱', imutils.resize(canny0))


    2.2 總觀代碼

    # 導(dǎo)庫(kù)

    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 轉(zhuǎn)換為黑白圖像

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

    # 對(duì)圖片 foliageNew 進(jìn)行高斯處理

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

    # foliageWhite 是葉子目標(biāo)檢測(cè)圖,讀取它

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

    # 將圖片 foliageWhite 轉(zhuǎn)換為黑白圖像

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

    # 對(duì)圖片 foliageWhite 進(jìn)行高斯處理

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

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

    pictureDelta = cv2.absdiff(PSpictureGS, originalPictureGS)

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

    x, y = pictureDelta.shape

    # print(x, y)

     

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

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

    # Canny 邊緣檢測(cè)

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

     

    # 定義輪廓(一片葉子)總面積

    LeafArea = 0

    # 定義綠葉(未被病蟲害葉面)的面積

    greenLeafArea = 0

    # 定義列表,用來(lái)存放要識(shí)別的像素點(diǎn)的位置

    distinguishLeaf = []

     

    # 畫輪廓,存儲(chǔ)要識(shí)別的像素值的位置,記錄在 distinguishLeaf 數(shù)組中

    for i in range(x):

        for j in range(y):

            if any(originalPicture[i, j] == [255, 255, 255]):  # 顏色為白色的時(shí)候,占位

                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

     

    # 統(tǒng)計(jì)綠葉占比

    scale = 100 - (greenLeafArea/LeafArea)*100

    percentage = "病蟲害葉面占比為:" + str(scale) + ' %'

    print(percentage)

     

    # cv2.imwrite("這里是存入本地圖片地址", 這里是要輸出哪一步圖片的代碼名稱)

    # canny0 = cv2.imread("這里是存入本地圖片地址")

    # cv2.imshow('這里是圖像標(biāo)題名稱', imutils.resize(canny0))

     

    if scale < 95:

        easygui.msgbox('警告!葉片遭受病蟲害!請(qǐng)盡早噴灑農(nóng)藥!')

     

    # 此行代碼用于避免輸出圖片發(fā)生閃退的現(xiàn)象

    key = cv2.waitKey(0)


    2.3 項(xiàng)目運(yùn)行結(jié)果

    1650517961342819.png

    1650517966687965.png

    3 總結(jié)展望

    從上述運(yùn)行結(jié)果來(lái)看,該片葉子已經(jīng)被病蟲害病害了越葉面面積的17%。此值已超過(guò)最小病害初定值,故最后彈出窗口顯示“警告!葉片遭受病蟲害!請(qǐng)盡早噴灑農(nóng)藥!”

    此項(xiàng)目運(yùn)用簡(jiǎn)單實(shí)例,介紹了計(jì)算機(jī)視覺技術(shù)在農(nóng)業(yè)方面的應(yīng)用,在幫助農(nóng)民贈(zèng)產(chǎn)脫貧方面起到了一定的作用。

    這就是“互聯(lián)網(wǎng)+”的實(shí)例項(xiàng)目實(shí)現(xiàn)。


    版權(quán)聲明:本專欄全部為CSDN博主「IT_change」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議。

                      轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

    感謝閱讀 ! 感謝支持 !  感謝關(guān)注 !

    希望本文能對(duì)讀者學(xué)習(xí)和理解計(jì)算機(jī)視覺技術(shù)有所幫助,并請(qǐng)讀者批評(píng)指正!

    2020年5月底于山西大同

    END

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

    版權(quán)聲明:本文為CSDN博主「榮仔!最靚的仔!」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

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


    關(guān)鍵詞: 智慧農(nóng)業(yè)

    評(píng)論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 东乡| 定兴县| 临夏县| 嘉定区| 南昌县| 呼图壁县| 溆浦县| 蒲城县| 包头市| 巢湖市| 广平县| 成安县| 武清区| 中西区| 绥宁县| 保亭| 武鸣县| 盱眙县| 麟游县| 福贡县| 曲沃县| 九龙坡区| 格尔木市| 同德县| 门源| 朔州市| 呼玛县| 民勤县| 久治县| 杨浦区| 原平市| 平南县| 宁城县| 隆子县| 饶平县| 泾川县| 依安县| 汤阴县| 龙井市| 九寨沟县| 温州市|