1. 程式人生 > >資料探勘實戰——基於水色影象的水質評價

資料探勘實戰——基於水色影象的水質評價

挖掘目的

用數字影象處理部分來作為資料探勘分析的資料來源,按水色判斷水質分類的資料以及用數碼相機按照標準進行水色採集的影象資料,利用影象處理技術,通過水色影象實現水質的自動評價。

分析方法

水樣影象維度過大,不易分析需要從中提取影象特徵,提取反映影象本質的一些關鍵指標,這點在資料預處理中本質上是屬性規約。屬性一定程度上的關鍵直接影響識別效果和分類的好壞。

影象特徵主要包括顏色特徵、紋理特徵、形狀特徵和空間關係特徵等。與幾何關係相比,顏色特徵具有更好的區分度,表現為對周圍環境以及物體的大小梯度均不敏感,魯棒性高。到本次試驗中,水色樣本的顏色特徵穩定性更好,所以主要關注顏色特徵。博主對於影象是個小白,還是老老實實的去解釋什麼是顏色特徵的吧?

顏色特徵是一種全域性特徵,描述了影象或影象區域的表面性質,就是基於畫素點的特徵,影象呈現出來的色彩,每一個畫素點都有各自的貢獻。這種方法如今很成熟,處理識別分類有很多研究成果,主要採用顏色直方圖和顏色矩方法。

顏色直方圖——反映影象顏色的組成分佈,即不同色彩在整幅影象的顏色出現概率,特別適用於描述那些難以自動分割的影象和要考慮物體空間位置的影象,缺點就是無法描述影象中顏色的區域性分佈及每種色彩的空間位置,即無法描述影象中的某一具體的物件或物體。

顏色矩——影象中的分佈都可以用他的矩表示,根據概率論的理論,隨機變數的概率分佈可以由其各階矩唯一的表示。一幅影象的色彩分佈可認為是一種概率分佈,那麼影象可以由其各階矩來描述。顏色矩包含各個顏色通道的一階距、二階距、三階距,對於一個RGB顏色空間的影象,具有R G B三個顏色通道,則有9個分量。

1)     一階顏色距

一階顏色矩採用一階原點矩,反映影象的整體明暗程度

                                              

其中,是在第i個顏色通道的一階顏色矩,對於RGB顏色空間的影象,i=1,2,3,是第j個畫素的第i個顏色通道的顏色值。

2)     二階顏色距

二階顏色矩採用的是二階中心距的平方根,反映影象顏色的分佈範圍

                                                       

其中是在第i個顏色通道的二階顏色矩,是在第i個顏色通道的一階顏色矩

3)     三階顏色距

三階顏色矩採用的是三階中心距的立方根,反映影象顏色分佈的對稱性

                                                       

其中是在第i個顏色通道的二階顏色矩,是在第i個顏色通道的一階顏色矩

本文考慮到顏色矩的特徵分量相對於顏色直方圖的特徵量較少,遂採用基於顏色矩的方法。即建立水樣影象與反映該影象特徵的資料資訊關係,同時由有經驗的專家對水樣影象根據經驗分類,建立水樣資料資訊和水質類別的專家樣本庫,進而構建分類模型,得到水樣影象與水質類別的對映關係,並經過不斷調整係數優化模型,最後利用訓練好的模型,自動判別出該水樣的水質類別。

資料預處理

1.影象切割

為了提取水的特徵,需要提取水樣影象中央部分(101*101)具有代表意義的影象。[中心點左右距離50,上下距離50的矩陣塊]

2.特徵提取

根據所提的顏色矩:一階距二階距三階距。得到影象顏色特徵如下所示:

3.模型構建

原樣本隨機抽樣,以劃分成80%訓練樣本和20%測試樣本。本案例採用支援向量機作為水質評價分類模型。SVM模型python裡面有相關的庫支援,具體原理百度即可。

其中,1~9為輸入的特徵,我們發現特徵的取值範圍都在0~1之間,也就是說,如果直接輸入SVM模型,彼此間的區分度會比較小。這時我們的常用處理方法——乘以1個k值,把資料間拉開,但是呢,k過大導致模型在訓練樣本中過擬合(如k=1000,在訓練樣本中準確率為100%,在測試樣本中準確率不到20%),k過小呢,又會導致區分度低,模型精確度差。因此只能根據測試準確率來選擇k的最優值。

經過反覆測試,本次建模中k的最優值大約為30.將特徵值統一乘以30,然後建立支援向量機模型。

程式碼如下:

#構造特徵和標籤
x_train=data_train[:,2:]*30#放大特徵
y_train=data_train[:,0].astype(int)#設定成int型
x_test=data_train[:,2:]*30#放大特徵
y_test=data_train[:,0].astype(int)

#匯入模型相關的函式,建立並訓練模型
from sklearn import svm
model=snm.SVC()
model.fit(x_train,y_train)

import pickle
pickle.dump(model,open('../tmp/svm.model','wb'))
#最後一句儲存模型,以後可以通過下面語句重新載入模型:
#model=pickle.load(open('../tmp/svm.model','rb'))

#匯入輸出相關的庫,生成混淆矩陣
from sklearn import metrics
cm_train=metrics.confusion_matrix(y_train,model.predict(x_train))#訓練樣本的混淆矩陣
cm_test=metrics.confusion_matrix(y_test,model.predict(x_test))#測試樣本的混淆矩陣

#儲存結果
pd.DataFrame(cm_train,index=range(1,6),columns=range(1,6)).to_excel(outputfile1)
pd.DataFrame(cm_test,index=range(1,6),columns=range(1,6)).to_excel(outputfile2)

4.訓練結果分析

建立模型後,利用訓練樣本進行回判,得到的混淆矩陣如下(中間的表示預測與實際正確),分類結果為96.91%。

5.水質評價

針對測試樣本我們進行評價,代入已構建好的支援向量機模型,得到的測試樣本的混淆矩陣如下。準確率達95.12%,說明水質分析的還不錯,方法可靠。

總結:最大的收穫就是明白了影象的顏色特徵——顏色矩,並構造。簡明實用。

至於其他書上是這麼說的。