請教,一直提醒不規范,但是不明白該怎么搞
瀏覽:2356
% 清空工作區和命令行窗口
clear;
clc;
% 步驟一:圖像數據準備
% 假設已經將可排放污水圖片放在文件夾 'dischargeable' 中,不可排放污水圖片放在文件夾 'non_dischargeable' 中
% 讀取可排放污水圖片并標注為1
dischargeableImages = imageDatastore('dischargeable', 'Label', '1');
% 檢查可排放污水圖片讀取情況
if isempty(dischargeableImages.Files)
error('可排放污水圖片讀取失敗,請檢查文件夾路徑及圖像文件是否存在。');
end
% 讀取不可排放污水圖片并標注為0
nonDischargeableImages = imageDatastore('non_dischargeable', 'Label', '0');
% 檢查不可排放污水圖片讀取情況
if isempty(nonDischargeableImages.Files)
error('不可排放污水圖片讀取失敗,請檢查文件夾路徑及圖像文件是否存在。');
end
% 合并兩類圖像數據
allImages = cat(1, dischargeableImages.Files, nonDischargeableImages.Files);
allLabels = cat(1, dischargeableImages.Labels, nonDischargeableImages.Labels);
% 創建圖像數據存儲對象并打亂順序
imageData = imageDatastore(allImages, 'Label', allLabels);
imageData = shuffle(imageData);
% 步驟二:圖像預處理及特征提取函數
function [features] = extractFeatures(image)
% 灰度化
grayImage = rgb2gray(image);
% 濾波去噪(這里使用中值濾波示例)
filteredImage = medfilt2(grayImage, [3 3]);
% 顏色特征 - 計算灰度直方圖
[histCounts, ~] = histogram(filteredImage); % 獲取直方圖計數及bin信息
% 對直方圖數據進行歸一化處理,使其在0到1之間,以便更好地作為特征
histCounts = histCounts / sum(histCounts);
% 紋理特征 - 使用灰度共生矩陣(GLCM)提取紋理特征
glcm = graycomatrix(filteredImage, 'Offset', [0 1; -1 1; -1 0; -1 -1]);
textureFeatures = graycoprops(glcm, {'contrast', 'correlation', 'energy', 'entropy'});
% 將各類特征組合成一個特征向量
features = [histCounts; textureFeatures.Contrast; textureFeatures.Correlation; textureFeatures.Energy; textureFeatures.Entropy];
end
% 步驟三:對所有圖像數據進行特征提取
numImages = numel(imageData.Files);
% 先讀取第一張圖像確定特征向量長度
firstImage = readimage(imageData, 1);
numFeatures = length(extractFeatures(firstImage));
featuresMatrix = zeros(numImages, numFeatures);
for i = 1:numImages
image = readimage(imageData, i);
featuresMatrix(i, :) = extractFeatures(image);
end
% 步驟四:建立判別模型(這里使用支持向量機 - SVM)
% 設置SVM的一些參數,例如核函數類型為高斯核('rbf'),可根據實際情況調整
svmModel = fitcsvm(featuresMatrix, imageData.Labels{:}, 'KernelFunction', 'rbf', 'BoxConstraint', 1);
% 步驟五:對待判斷污水圖片進行分析判斷是否可排放
% 假設待判斷污水圖片名為 'test_wastewater.jpg'
testImage = imread('test_wastewater.jpg');
if isempty(testImage)
error('待判斷污水圖片讀取失敗,請檢查圖片路徑及文件是否存在。');
end
testFeatures = extractFeatures(testImage);
predictedLabel = predict(svmModel, testFeatures);
if predictedLabel == '1'
disp('污水可排放');
else
disp('污水不可排放');
end




















