NDVI與智慧農業

        隨著ICT產業軟硬體的發展,世界各國的傳統農業也在電腦科技日新月益的協助下興起了一股精準農業(precision agriculture)風潮,依照農委會的定義,精準農業是一種「以資訊及技術為基礎的農業經營管理系統,針對農田及植栽環境的變異給予最適當的耕作決策與處理,以減少資材之耗費,增加收益及減輕環境衝擊的經營管理手段。」

        因此本質上這是一種以資訊科技為基礎的一種農業革命,尤其這幾年更在大數據分析、物聯網、M2M(Machine to Machine)、Machine Learning等資訊技術的輔助下,更蛻變為所謂的「智慧農業(Smart farming)」,諸如空氣/土壤溫溼度、水含量、大氣壓力、雨量、灌溉水量、光照度、風速、氣候預測、植被綠化指數…等等數據,可經由衛星定位、遙感裝置和近端數據採集技術,透過精確的資訊搜集掌握與統計分析,提供決策與管理分析與回饋,最終目的在於提高生產效率,最終讓工作量及人力需求減至最低且每單位的產量最高。

http://www.nesta.org.uk/sites/default/files/future_farms_infographic_precision_agriculture.jpg(圖片引自http://www.nesta.org.uk/news/precision-agriculture

        在上圖中,勾勒出了一幅完美的Smart farming面貌:

  1. 放牧的牛羊身上配戴著能夠傳送短訊息的感測器,即時的監控牲畜的健康狀況、移動位置,可提高存活率並提高10%牛奶產量。
  2. 農田上的智慧型拖拉機可透過GPS定位並控制,精確效率的規劃路線,可減少土石流失並增加10%作物產量。
  3. 這是經過特殊設計的農業自動化車隊,適用於除草、播種、施肥、土質辨識、採收…等任務,其中針對施肥的部份,由於經過明確的計算與定位分析,可節省肥料費用99%以上。
  4. 空中無人機可從農場上方大規模的進行土質調查、播種情況、生長分析、定位有害雜草、病蟲害等範圍,提高農作物產量2~5%。

NDVI:分析植物生長的指標

 無人機搭載紅外線攝影機所拍攝的近紅外線相片,是Smart farming中相當重要的一項資訊,使用此類近紅外線資訊來計算植物生長狀況稱為Vegetation Indices(植被指數),其中以NDVI最廣為使用。

https://www.verydrone.com/wp-content/uploads/2016/10/a9483e5711243fffa5bdd5b96170c52d-1.jpg

        

        NDVI是Normalized Difference Vegetation Index的縮寫,依字面中譯為「標準化植被指數」,原理是透過近紅外線相片來評估植物生長狀態,目前已廣泛使用於農業作物種植、以及衛星圖的植被分析判斷。

NDVI怎麼計算的?

        植物生長與近紅外線之間有很大的關係!

我們平常看到的植物為綠色,這是因為植物吸收了三原色中的紅、藍兩色光,反射綠色光,因此我們看到的是綠色的植物。

        「光」也是一種帶有頻率的電磁波,實際上,我們人眼所能看到的可見光,其波長僅佔電磁波中一小部份而已,約落在400到700nm之間。(圖片來自維基百科https://zh.wikipedia.org/wiki/%E5%8F%AF%E8%A7%81%E5%85%89)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp91.png

        其中,各顏色中波長最長的紅光介於610-780nm,再往上到1400nm這個區段稱為「近紅外線(Infra-red)」,這段稱為NIR的紅色光我們人眼雖看不見,但植物卻會反射這段光譜,尤其是葉綠素含量多的植物,它們會吸收大部份的紅、藍光,再反射綠光及更多的近紅外光NIR,請參考下圖。

        由於相機可同時補捉到可見光及不可見光NIR ,因此如果我們移除一般相機CCD前方的IR-cut,讓NIR能進到CCD上,然後在鏡頭前方加上一片藍色濾鏡,那麼照射到相機CCD上的光線就會變成這樣子:

        紅光被過濾掉了,僅留下藍、綠光及不可見的NIR穿過濾鏡到達CCD,這類的相片成像如下圖,由於缺乏可見紅光,因此相片呈現藍綠色調。

D:\temp\VM\NDVI\17158994_1457095054309933_3892681343624675306_o.jpg

本相片由Farmbot專案的林永仁先生拍攝

        這樣去除了可見紅光保留了NIR資訊的相片稱為NIR-GB,如前所述,由於植物會吸收紅藍色光並反射NIR,富含葉綠色的植物反射的更多,因此,NIR-GB相片中的blue channel所捕捉的近紅外線強弱可用來判斷植物生長狀態的指標。

        一般所見的NDVI相片是經過套色以不同的色表來表示NIR的強弱(植物生長的狀況),例如我們可透過https://infragram.org/ 網站,上傳NDVI相片後取得如下相片,以紅黃綠三色來代表NIR的強弱。

D:\temp\17352156_1473405352678903_1070110848442652996_n.jpg

        相關步驟流程請參考林永仁先生為Farmbot專案所撰寫的「單張NDVI 影相轉換流程」https://www.facebook.com/groups/FarmBotTUG/757832057732854/

分析NDVI影像

        NDVI值計算的公式是:

        

        標準公式: NDVI = NIR-R / NIR+R

    如果使用藍色濾鏡: NDVI =NIR-B / NIR+B

因此我們先將相片拆為b, g, r三個channel。

                b, g, r = cv2.split(image)

        計算分母的值。

            divisor = (r.astype(float) + b.astype(float))

        若=0將值改為0.01,以免發生錯誤。

                divisor[divisor == 0] = 0.01  # Make sure we don’t divide by zero!

        相除得到NDVI值。

                ndvi = (b.astype(float) – r) / divisor

        印出該相片NDVI的最大平均、中位、以及最小值。

        print(‘\nMax NDVI: {m}’.format(m=ndvi.max()))

        print(‘Mean NDVI: {m}’.format(m=ndvi.mean()))

        print(‘Median NDVI: {m}’.format(m=np.median(ndvi)))

        print(‘Min NDVI: {m}’.format(m=ndvi.min()))

        計算出的NDVI值即可作為植物生長或覆蓋率的參考。

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp92.png

NDVI強弱可視化

        

NDVI最高值的區域(紅色區):

        作法:由於黃色在RGB色彩中是Red加上Green的結果,因此我們直接將相片轉為LAB color space,使用其B channel抓出較強的黃色部份即為NDVI最高的區域:

    #調整此th可控制取值的範圍

        th = 100    

    #轉換為LAB color space

        cspace = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)

    #保留LAB的第三層B強度介於th~255之間的像素,其餘捨棄。

        masked = cv2.inRange(cspace[:,:,2], th, 255)

        最左側為標準的NDVI套色圖,中間為原圖,最右圖為上面程式執行結果。

NDVI最中間值的區域(黃色區):

        作法:黃色區指的是NDVI中間值以上的區域,包含上面的紅色區,我們使用HSV color space的第二層S(飽和度)。

    #調整此th可控制取值的範圍

        th = 140

    #轉換為HSV color space

        cspace = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

    #保留HSV的第二層S強度介於th~255之間的像素,其餘捨棄。

        masked = (255 – cv2.inRange(cspace[:,:,1], th, 255))

        最左側為標準的NDVI套色圖,中間為原圖,最右圖為上面程式執行結果。

NDVI最低值的區域(綠色區):

        作法:使用HSV color space的第二層S,與黃色區強度值相反的區域。

    #調整此th可控制取值的範圍

  th = 140

    #轉換為HSV color space

        cspace = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

    #保留HSV的第二層S強度介於th~255之間的像素,其餘捨棄。

        masked = cv2.inRange(cspace[:,:,1], th, 255)

        最左側為標準的NDVI套色圖,中間為原圖,最右圖為上面程式執行結果。

計算NDVI分佈比率

        以紅色為例,我們利用Numpy的count_nonzero指令計算非0的像素,再除以整張相片的像素,即是高NDVI所佔的比率。以同樣方法計算黃色與綠色,這三種強中弱的比率資訊可作為植物生長指標的參考。

        points = np.count_nonzero(mask)

    ratio = points / (image.shape[1] * image.shape[2])

    print(“Red area: {} pixls, ratio: {}%".format(points, ratio ))

近紅外線相片分析

        下面的NDVI相片皆由Farmbot專案的林永仁先生所拍攝提供。完整的NDVI程式已放置於https://github.com/ch-tseng/image-NDVI,可直接下載後直接執行。

示範執行如下:

與經過https://infragram.org/ 網站套色的假色圖比較,差異並不大,因此,本程式可應用於NDVI相片自動化的功能。

D:\temp\ndvi1.png

D:\temp\ndvi2.png

D:\temp\ndvi3.png

D:\temp\ndvi4.png

D:\temp\ndvi5.png

D:\temp\ndvi6.png

        在上面的範例中,紅色代表NDVI最強的區域,這是從LAB color space的B channel中像素強度值較高的部份取得。代表NDVI中間與較低值的黃色與綠色部份,則是從HSV color space的第二層S(飽和度)來取得。

廣告

發表迴響

Please log in using one of these methods to post your comment:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s