% 清空工作区和命令行窗口
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);
if predictedLabel == '1'
disp('污水可排放');
else
disp('污水不可排放');
end
更多回帖