數據實戰案例:基於水色影象的水質評價(超詳細/附數據)

2020-08-12 10:57:36

基於水色影象的水質評價

隨着工業技術的日益提升,人類的生活變得越來越便利。但與此同時環境污染問題日趨嚴重,大氣、土壤、水質污染是各個工業國家不得不面對的問題。污染需要治理,因此對於污染物的評價與監測十分重要。水產養殖業是我國國民經濟的一個重要組成部分,在水產養殖過程中,選擇沒有污染的水域進行養殖十分重要。

本章使用拍攝的池塘水樣圖片數據,結合影象切割和特徵提取技術,使用決策樹演算法,對圖樣的水質進行預測,以輔助生產人員對水質狀況進行判斷。

1.背景與挖掘目標

從事漁業生產有經驗的從業者可通過觀察水色變化調控水質,以維持養殖水體生態系統中浮遊植物、微生物類、浮遊動物等合理的動態平衡。由於這些多是通過經驗和肉眼觀察進行判斷,存在主觀性引起的觀察性偏倚,使觀察結果的可比性、可重複性降低,不易推廣應用。當前,數位影像處理技術爲計算機監控技術在水產養殖業的應用提供更大的空間。在水質線上監測方面,數位影像處理技術是基於計算機視覺,以專家經驗爲基礎,對池塘水色進行優劣分級,達到對池塘水色的準確快速判別。

結合某地區的多個羅非魚池塘水樣的數據,實現以下目標。

(1)對水樣圖片進行切割,提取水樣圖片中的特徵。

(2)基於提取的特徵數據,構建水質評價模型。

(3)對構建的模型進行評價,評價模型對於水色的識別效率。

2.分析方法與過程

通過拍攝水樣,採集得到水樣影象,而影象數據的維度過大,不容易分析,需要從中提取水樣影象的特徵,提取反映影象本質的一些關鍵指標,以達到自動進行影象識別或分類的目的。顯然,影象特徵提取是影象識別或分類的關鍵步驟,影象特徵提取的效果如何直接影響到影象識別和分類的好壞。

影象特徵主要包括有顏色特徵、紋理特徵、形狀特徵、空間關係特徵等。與幾何特徵相比,顏色特徵更爲穩健,對於物體的大小和方向均不敏感,表現出較強的魯棒性。本案例中由於水色影象是均勻的,故主要關注顏色特徵。顏色特徵是一種全域性特徵,描述了影象或影象區域所對應的景物的表面性質。一般顏色特徵是基於畫素點的特徵,所有屬於影象或影象區域的畫素都有各自的貢獻。在利用影象的顏色資訊進行影象處理、識別、分類的研究中,在實現方法上已有大量的研究成果,主要採用顏色處理常用的直方圖法和顏色矩1方法等。

顏色直方圖是最基本的顏色特徵表示方法,它反映的是影象中顏色的組成分佈,即出現了哪些顏色以及各種顏色出現的概率。其優點在於它能簡單描述一幅影象中顏色的全域性分佈,即不同色彩在整幅影象中所佔的比例,特別適用於描述那些難以自動分割的影象和不需要考慮物體空間位置的影象。其缺點在於它無法描述影象中顏色的區域性分佈及每種色彩所處的空間位置,即無法描述影象中的某一具體的物件或物體。

基於顏色矩提取影象特徵的數學基礎在於影象中任何的顏色分佈均可以用它的矩來表示。根據概率論的理論,隨機變數的概率分佈可以由其各階矩唯一的表示和描述。一副影象的色彩分佈也可認爲是一種概率分佈,那麼影象可以由其各階矩來描述。顏色矩包含各個顏色通道的一階距、二階矩和三階矩,對於一副RGB顏色空間的影象,具有R、G和B三個顏色通道,則有9個分量。

顏色直方圖產生的特徵維數一般大於顏色矩的特徵維數,爲了避免過多變數影響後續的分類效果,在本案例中選擇採用顏色矩來提取水樣影象的特徵,即建立水樣影象與反映該影象特徵的數據資訊關係,同時由有經驗的專家對水樣影象根據經驗進行分類,建立水樣數據資訊與水質類別的專家樣本庫,進而構建分類模型,得到水樣影象與水質類別的對映關係,並經過不斷調整係數優化模型,最後利用訓練好的分類模型,使用者就能方便地通過水樣影象,自動判別出該水樣的水質類別。

2.1分析步驟與流程

基於水色影象特徵提取的水質評價流程下圖所示。

在这里插入图片描述
主要步驟如下:

(1)從採集到的原始水樣影象中進行選擇性抽取形成建模數據。

(2)對步驟(1)形成的數據集進行數據預處理,包括影象切割和顏色矩特徵提取。

(3)利用步驟(2)形成的已完成數據預處理的建模數據,劃分爲訓練集與測試集。

(4)利用步驟(3)的訓練集構建分類模型。

(5)利用步驟(4)的構建好的分類模型進行水質評價。

2.2數據預處理

附件(關注「泰迪學院」公衆號,回覆 回復客服領取)目錄下給出了某地區的多個羅非魚池塘水樣的數據,包含水產專家按水色判斷水質分類的數據以及用數碼相機按照標準進行水色採集的數據,每個水質圖片命名規則爲「類別-編號.jpg」,如「1_1.jpg」說明當前圖片屬於第1類的樣本。

在这里插入图片描述

在这里插入图片描述
數據微信關注泰迪學院,回覆 回復水色領取

1.影象切割

採集到的水樣影象包含盛水容器,容器的顏色與水體顏色差異較大,同時水體位於影象中央,爲了提取水色的特徵,需要提取水樣影象中央部分具有代表意義的影象,具體實施方式是提取水樣影象中央101×101畫素的影象。設原始影象II的大小是M×NM×N,則擷取寬從第fixM250fix(\frac{M}{2})-50個畫素點到第fixM2+50fix(\frac{M}{2})+50個畫素點,長從第fixN250fix(\frac{N}{2})-50個畫素點到第fixN2+50fix(\frac{N}{2})+50個畫素點的子影象。

使用Python程式設計軟體進行程式設計,即可把下圖中左邊的切割前的水樣影象切割並儲存到右邊的切割後的水樣影象。

在这里插入图片描述

2.特徵提取

在本案例中選擇採用顏色矩來提取水樣影象的特徵,下面 下麪給出各階顏色矩的計算公式。

(1)一階顏色矩
一階顏色矩採用一階原點矩,反映了影象的整體明暗程度,如式(1)所示。
Ei=1Nj=1Npij(1)E_{i}=\frac{1}{N}\sum_{j=1}^{N}p_{ij}\quad(1)
式(1)中是在第個顏色通道的一階顏色矩,對於RGB顏色空間的影象,是第個畫素的第個顏色通道的顏色值。

(2)二階顏色矩
二階顏色矩採用的是二階中心距的平方根,反映了影象顏色的分佈範圍,如式(2)所示。
σi=1Nj=1N(pijE)2(2)\sigma_{i}=\sqrt{\frac{1}{N}\sum_{j=1}^{N}(p_{ij}-E )^2}\quad(2)
式(2)中是在第個顏色通道的二階顏色矩,是在第個顏色通道的一階顏色矩。

(3)三階顏色矩
三階顏色矩採用的是三階中心距的立方根,反映了影象顏色分佈的對稱性,如式(3)所示。
si=1Nj=1N(pijEi)33(3)s_{i}=\sqrt[3]{\frac{1}{N}\sum_{j=1}^{N}(p_{ij}-E_i )^3}\quad(3)
式(3)中是在第個顏色通道的三階顏色矩,是在第個顏色通道的一階顏色矩。

對切割後的影象提取其顏色矩,作爲影象的顏色特徵。顏色矩的提取,並且提取每個檔名中的類別和序號,同時針對所有的圖片都進行同樣的操作,因提取的特徵的取值範圍差別較大,如果直接輸入模型,可能會導致模型精確度下降,因此,在建模之前需要將數據進行標準化,因如下所示。


import numpy as np
import os,re
from PIL import Image

# 影象切割及特徵提取
path = './demo/data/images/'  # 圖片所在路徑
# 自定義獲取圖片名稱函數
def getImgNames(path=path):
    '''
    獲取指定路徑中所有圖片的名稱
    :param path: 指定的路徑
    :return: 名稱列表
    '''
    filenames = os.listdir(path)
    imgNames = []
    for i in filenames:
        if re.findall('^\d_\d+\.jpg$', i) != []:
            imgNames.append(i)
    return imgNames

# 自定義獲取三階顏色矩函數
def Var(data=None):
    '''
    獲取給定畫素值矩陣的三階顏色矩
    :param data: 給定的畫素值矩陣
    :return: 對應的三階顏色矩
    '''
    x = np.mean((data-data.mean())**3)
return np.sign(x)*abs(x)**(1/3)

# 批次處理圖片數據
imgNames = getImgNames(path=path)  # 獲取所有圖片名稱
n = len(imgNames)        # 圖片張數
data = np.zeros([n, 9])  # 用來裝樣本自變數
labels = np.zeros([n])   # 用來放樣本標籤

for i in range(n):
    img = Image.open(path+imgNames[i])  # 讀取圖片
    M,N = img.size  # 圖片畫素的尺寸
    img = img.crop((M/2-50,N/2-50,M/2+50,N/2+50))    # 圖片切割
    r,g,b = img.split()     # 將圖片分割成三通道
    rd = np.asarray(r)/255  # 轉化成陣列數據
    gd = np.asarray(g)/255
    bd = np.asarray(b)/255

    data[i,0] = rd.mean()  # 一階顏色矩
    data[i,1] = gd.mean()
    data[i,2] = bd.mean()

    data[i,3] = rd.std()   # 二階顏色矩
    data[i,4] = gd.std()
    data[i,5] = bd.std()

    data[i,6] = Var(rd)    # 三階顏色矩
    data[i,7] = Var(gd)
    data[i,8] = Var(bd)

    labels[i] = imgNames[i][0]  # 樣本標籤

數據微信關注泰迪學院,回覆 回復水色領取

2.3 模型構建

本案例採用決策樹作爲水質評價分類模型,模型的輸入包括兩部分,一部分是訓練樣本的輸入,另一部分是建模參數的輸入。各參數說明如下表所示。

在这里插入图片描述
其中1~9均爲輸入的特徵,對標準化後的樣本進行抽樣,抽取80%作爲訓練樣本,剩下的20%作爲測試樣本,用於水質評價檢驗,使用決策樹演算法構建水質評價模型,如下所示。


from sklearn.model_selection import train_test_split
# 數據拆分,訓練集、測試集
data_tr,data_te,label_tr,label_te = train_test_split(data,labels,test_size=0.2,random_state=10)

from sklearn.tree import DecisionTreeClassifier
# 模型訓練
model = DecisionTreeClassifier(random_state=5).fit(data_tr, label_tr) 

數據微信關注泰迪學院,回覆 回復水色領取

2.4水質評價

取所有測試樣本爲輸入樣本,代入已構建好的決策樹模型,得到輸出結果,即預測的水質型別,如程式碼如下所示。

# 水質評價
from sklearn.metrics import confusion_matrix
pre_te = model.predict(data_te)
# 混淆矩陣
cm_te = confusion_matrix(label_te,pre_te)
print(cm_te)
from sklearn.metrics import accuracy_score
# 準確率
print(accuracy_score(label_te,pre_te))

數據微信關注泰迪學院,回覆 回復水色領取

通過程式碼清單3得到水質評價的混淆矩陣見下表,分類準確率爲70.73%,說明水質評價模型對於新增的水色影象的分類效果較好,可將模型應用到水質自動評價系統,實現水質評價。(注意,由於用隨機函數來打亂數據,因此重複試驗所得到的結果可能有所不同。)

在这里插入图片描述

小結

本案例結合基於水色影象進行水質評價的案例,重點介紹了影象處理演算法中的顏色矩提取和數據挖掘演算法中決策樹演算法在實際案例中的應用。利用水色影象顏色矩的特徵,採用決策樹演算法進行水質評價,並詳細的描述了數據挖掘的整個過程,也對其相應的演算法提供了Python語言上機實驗。


  1. 註腳的解釋[Stricker M A, Orengo M. Similarity of color images[C]//IS&T/SPIE’s Symposium on Electronic Imaging: Science & Technology. International Society for Optics and Photonics, 1995: 381-392.] ↩︎