直接上代码,数据预处理很重要,其它没啥了
%第一部分:读取图像
% 定义树叶种类和每种树叶的图片数量
%%
leafTypes = {'Quercussuber', 'Salixatrocinerea', 'Populusnigra', 'Alnussp', 'Quercusrobur', 'Crataegusmonogyna', 'Ilexaquifolium', 'Neriumoleander'};
numImagesPerType =8;%每种树叶选取8张导入数据集
pi=3.14;
% 初始化数据集
dataset = struct();%原始图像
%data2bw=struct();%二值图像
%datargbgray = struct();%灰度图像
%datargbhsi = struct();%HSI图像
% 通过for循环读取图片并添加到数据集中
for i = 1:length(leafTypes)
for j = 1:numImagesPerType
imagePath = ['C:\Users\灰太狼\OneDrive\桌面\图片训练集\', leafTypes{i}, '\iPAD2_C0_EX0', num2str(j), '.jpg'];
imageData = imread(imagePath);
dataset.(leafTypes{i}){j} = imageData;
%datargbgray.(leafTypes{i}){j}=imageData;
%datargbhsi.(leafTypes{i}){j}=imageData;
%data2bw.(leafTypes{i}){j}=imageData;
%figure;
%imshow(imageData);%显示原始图像
end
end
%
%for leafType = fieldnames(dataset)'
%for imageIndex = 1:numImagesPerType
% imageData = dataset.(leafType{1}){imageIndex};
%
%imagegray=im2gray(imageData);
%imagegrayopen=imopen(imagegray,se);
%imagegray=imagegrayopen+imagegray;
%datargbgray.(leafTypes{i}){j}=imagegray;
%figure;
%imshow(imagegray);
%
%imagehsv=rgb2hsv(imageData);
%images=imagehsv(:,:,2);
%imagetransit=im2bw(imageData);
%imagehsv=images.*imagetransit;
%datargbhsi.(leafTypes{i}){j}=imagehsv;
%figure;
%imshow(imagehsv);
% end
%end
%imshow(data2bw.three{5});
%第二部分:特征提取
featuredataset=struct();%建立特征数据集
pi=3.14159;
for leafType = fieldnames(dataset)' %建立循环预处理图像,并在图像处理完成后提取特征储存
for imageIndex = 1:numImagesPerType
imageDatas = dataset.(leafType{1}){imageIndex};
%二值化预处理,对RGB图像进行调整,提亮绿色,减少黑色
r = imageDatas(:,:,1);
g = imageDatas(:,:,2);
%%
b = imageDatas(:,:,3);
% 减少黑色分量(降低蓝色和红色通道的值)
r = r * 0.8;
b = b * 0.8;
% 增加绿色分量
g = g * 1.2;
%处理棕色部分,即绿叶枯萎那部分
brown_threshold = 125; % 比如红色和绿色分量都小于 125 可视为棕色
% 对棕色像素进行处理
brown_pixels = (r < brown_threshold) & (g < brown_threshold);
g(brown_pixels) = g(brown_pixels) + 80; % 增加绿色分量
new_img = cat(3, r, g, b);% 组合修改后的通道
hsv = rgb2hsv(new_img);%将RGB模型转为HSI模型
% 提取 V 通道(亮度),调整亮度
v_channel = hsv(:,:,3);
threshold = 1;% 设定一个阈值,低于该阈值的认为是较黑部分
v_channel(v_channel < threshold) = v_channel(v_channel < threshold) + 1; % 将较黑部分的 V 通道值增加一些以变亮一点
hsv(:,:,3) = v_channel;% 根据调整后的 V 通道更新 HSV
adjusted_img = hsv2rgb(hsv); % 将 HSV 转换回 RGB
%figure;
%imshow(adjusted_img);
%运用超绿指数提取树叶的二值图像
image = im2double(adjusted_img); %图像运算不能用uint8类型,会发生溢出现象,要转成double类型
R = image(:,:,1);
G &