imageDir = 'C:\Users\86150\Desktop\zyc_image\lesionimages\images\';
maskDir = 'C:\Users\86150\Desktop\zyc_image\masks\masks\';
imageFiles = dir(fullfile(imageDir, '*.jpg')); % 或者是你的图像格式
maskFiles = dir(fullfile(maskDir, '*.png')); % 假设mask是PNG格式
loadedData = load('C:\Users\86150\Desktop\zyc_image/groundtruth_labels.mat');
%groundtruth = loadedData.groundtruth_labels;
%groundtruth = cellfun(@(label) double(strcmp(label, 'malignant')), loadedData.groundtruth_labels(:,2));
labelsCell = loadedData.groundtruth_labels(:, 2);
% 转换标签为数值型(0为benign,1为malignant)
% labels = cellfun(@(x) double(strcmp(x, 'malignant')), labelsCell);
numImages = length(imageFiles);
indices = randperm(numImages);
%indices = randperm(numImages);
% 分配比例,例如70%训练,30%测试
numTrain = round(numImages * 0.7);
trainIndices = indices(1:numTrain);
testIndices = indices(numTrain+1:end);
% 创建训练集和测试集
trainImages = imageFiles(trainIndices);
testImages = imageFiles(testIndices);
trainMasks = maskFiles(trainIndices);
testMasks = maskFiles(testIndices);
groundtruth = labelsCell(trainIndices);
testlables = labelsCell(testIndices);
%
%
% % 假设extractEdgeFeatures函数如上所定义
%
% 为训练图像初始化特征矩阵
imfeatures = zeros(numTrain, 4); % 根据需要调整特征数量
%
% 为训练集中的每个图像提取特征
for i = 1:numTrain
maskPath = fullfile(maskDir, trainMasks(i).name); % 获取当前图像的掩膜路径
imfeatures(i, :) = extractEdgeFeatures(maskPath); % 提取特征并存储
end
% 归一化特征矩阵
% 最简单的归一化形式是将每个特征缩放到[0,1]区间
minFeatures = min(imfeatures, [], 1); % 计算每个特征的最小值
maxFeatures = max(imfeatures, [], 1); % 计算每个特征的最大值
% 防止除以零,如果某个特征的最大值和最小值相同,则将其设为1
rangeFeatures = maxFeatures - minFeatures;
rangeFeatures(rangeFeatures == 0) = 1;
% 对特征进行归一化
normFeatures = (imfeatures - minFeatures) ./ rangeFeatures;
rng(1); % 确保结果可复现
svm = fitcsvm(imfeatures, groundtruth);
cvsvm = crossval(svm, 'KFold', 10); % 10倍交叉验证
pred = kfoldPredict(cvsvm);
% 生成混淆矩阵并可视化
[cm, order] = confusionmat(groundtruth, pred);
confusionchart(cm, order);
function [features] = extractEdgeFeatures(maskPath)
mask = imread(maskPath); % 读取mask图片
mask = imbinarize(mask); % 将mask二值化
perimeter = bwperim(mask, 8); % 获取边缘
% 计算形状特征
stats = regionprops(mask, 'Area', 'Perimeter', 'Eccentricity','solidity');
% 特征向量
features = zeros(1, 4);
if ~isempty(stats)
area = stats.Area;
perimeter = stats.Perimeter;
eccentricity = stats.Eccentricity;
% 边缘平滑度,周长平方除以面积
smoothness = perimeter^2 / area;
solidity = stats.Solidity;
features = [area, smoothness, eccentricity,solidity];
end
end
我想设计一个基于计算机视觉的系统,该系统能够区分恶性黑色素瘤和良性皮肤病变的图像,原始图像已经处理好成为mask

下图是groundtruth_labels的数据

输出结果如下图

请问怎么才能提高准确率!谢谢