数据分析与挖掘实战-基于水色图像的水质评价
基于水色圖像的水質評價
背景
有經驗的漁業生產的從業者可以通過觀察水質變化調控水質,來維持養殖水體生態系統中的浮游植物、微生物、浮游動物等的動態平衡,然而這些判斷是通過經驗和肉眼觀察得出的,存在主觀性引起的觀察性偏差,使觀察結果的可比性、可重復性降低,不易推廣使用。
數字圖像處理技術為計算機監控技術在水產養殖業的應用提供了更大的空間。在水質在線監測方面,數字圖像處理技術是基于計算機視覺的,以專家經驗為基礎,對水色進行優劣分級,實現對水色的準確快速判別。
目標
利用給出的已經分類的數據,利用圖像處理技術實現水質自動評價。
分析
通過拍攝得到的圖像數據維度太大,不易分析,需要提取圖像的特征,提取反映圖像本質的關鍵指標,以達到自動進行圖像識別或者分類的目的。顯然,圖像特征提取是圖像識別和分類的關鍵步驟,提取的結果直接關系到圖像識別和分類的好壞。
圖像特征主要包括顏色特征、紋理特征、形狀特征和空間關系特征等。與幾何特征相比,顏色特征更為穩健,對物體的大小和方向不敏感,表現出較強的魯棒性。由于本案例中的水色圖像是均勻的,所以主要關注顏色特征。
顏色特征是一種全局特征,描述圖像或者圖像對應景物的表明性質。一般顏色特征是基于像素點的特征,所以圖像區域的像素點都有自己的貢獻。在利用圖像顏色特征進行分析的研究中,實現方法上已經有啦很多研究成果,主要采用直方圖法和顏色矩方法。
其中直方圖法反映顏色分布,即哪些顏色及其出現概率,優點是適合描述難以自動分割的圖像和不需要考慮物體空間位置的圖像;缺點是無法描述顏色的局部分布及每種色彩所處的空間位置,也就是無法描述圖像中的某一具體的對象和物體。
其中顏色矩法的數字基礎為圖像中的任何顏色分布均可以用它道德矩來表示。根據概率論,隨機變量的概率分布可以由其各階矩唯一描述和表示。一個圖像的顏色分布完全可以看做是一種概率分布,圖像就可以由各階矩描述。顏色矩包含各個顏色的一階矩、二階矩和三階矩,一個RGB圖像有R、G、B三個通道,共9個分量。
直方圖法產生的特征維數一般會大于顏色矩產生的,為了避免過多變量干擾分類結果,使用顏色矩法。
處理過程
數據獲取
給定圖像數據集。
數據探索
由于是圖像數據,進行觀察探索即可。
數據預處理
圖像切割
不難發現,圖像中的盛水容器干擾了特征分析,需要提取中心部分有意義的圖像(定位101*101像素大小)。使用MATLAB或PIL等工具切割圖像,得到切割后的圖像。
特征提取
提取切割后的圖像顏色矩,作為顏色特征,提取顏色矩時提取文件名中的類別和編號,得到數據集。
數據挖掘建模
按照傳統機器學習中的82比劃分訓練集和測試集,使用支持向量機進行分類。同時應該注意到數據特征的區間極為接近[0-1],,直接輸入SVM中區分度很小,這里就應該走歸一化的反路,將數據統一乘一個數值擴大區分度。
這個數值過大過小都是不合適的。過小區分度過低,模型精確度差;過大則容易導致模型在訓練樣本中過擬合(這是很煩的一個問題)。可以根據測試準確率來選擇合適的取值,經過反復測試選擇30。
后續處理
建立模型后立業訓練樣本進行回判,得到混淆矩陣,判斷是否可用。取測試樣本輸入,代入模型得到輸出,得到混淆矩陣,判斷模型可用價值。
# -*- coding: utf-8 -*- import pandas as pd from numpy.random import shuffle from sklearn import svm from sklearn import metrics from sklearn.model_selection import train_test_splitdef getDataSet(fileName):# 取得原數據切分落地data = pd.read_csv(fileName, encoding='gbk')data = data.values# 隨機打亂shuffle(data)label = data[:, :1]dataSet = data[:, 2:]# 這里依然遵循機器學習最原始的82開分配訓練集和測試集trainData, testData, trainLabel, testLabel = train_test_split(dataSet, label, test_size=0.2)# 這里參數過多就直接定義一個內部函數def dataAdjust(trainData, testData, trainLabel, testLabel):# 數據區間過于接近,經過數據探索不難得知需要擴大數據范圍,經過分析可以進行*30操作x_train = trainData[:, :]*30y_train = trainLabel[:, :].astype(int)x_test = testData[:, :]*30y_test = testLabel[:, :].astype(int)return x_train, y_train, x_test, y_testa, b, c, d = dataAdjust(trainData, testData, trainLabel, testLabel)return a, b, c, ddef modeling(x_train, y_train, x_test, y_test):# 建立模型model = svm.SVC()model.fit(x_train, y_train)# 預測數據生成混淆矩陣# 首先預測訓練集,成為回判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('訓練集回判預測混淆矩陣.xls')pd.DataFrame(cm_test, index=range(1, 6), columns=range(1, 6)).to_excel('測試集預測混淆矩陣.xls')if __name__ == '__main__':inputFile = './data/moment.csv'a, b, c, d = getDataSet(inputFile)modeling(a, b, c, d)補充說明
由于拍攝圖片資源過大,就不上傳GitHub了,這里使用分析圖像所得特征數據集(圖像數據集可以評論或者私戳我)。參考了《Python數據分析與挖掘實戰》,具體數據集和代碼見我的GitHub,歡迎star或者fork。
總結
以上是生活随笔為你收集整理的数据分析与挖掘实战-基于水色图像的水质评价的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排序算法-08基数排序(python实现
- 下一篇: 安卓重构系列-01使用Kotlin开发第