Matlab论坛
直播中

张家儒

未满1年用户 3经验值
擅长:模拟技术
私信 关注
[问答]

请教,matlab对于与多个参数名称匹配的问题。

% 清空工作区和命令行窗口

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);

  1. predictedLabel = predict(svmModel, testFeatures);

if predictedLabel == '1'

disp('污水可排放');

else

disp('污水不可排放');

end
4c506aed5d66835133cfcba1d937892.png

奖励1积分

回帖(1)

王鑫

2024-12-2 09:10:24
在 MATLAB 中,`imageDatastore` 函数用于创建一个包含图像数据和标签的数据存储对象。在你的代码中,你试图使用 `imageDatastore` 来读取两个文件夹中的图像,并为它们分别标注为1和0。但是,你的代码中存在一些问题,导致无法正确读取图像。

问题1:`imageDatastore` 函数的参数名称不匹配
在你的代码中,`imageDatastore` 函数的参数名称不匹配。正确的参数名称应该是 `Label`,而不是 `'Label'`。

问题2:文件夹路径可能不正确
确保你的文件夹路径是正确的,并且文件夹中确实存在图像文件。

以下是修改后的代码:

```matlab
% 清空工作区和命令行窗口
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
```

注意:确保你的 MATLAB 版本支持 `imageDatastore` 函数。如果你的 MATLAB 版本较低,可能需要使用其他函数来读取图像数据。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分