1.代码
% 指定输入和输出文件夹路径
inputFolder = 'InputFolder'; % 修改为包含要处理图像的文件夹路径
outputFolder = 'OutputFolder'; % 修改为保存处理后的图像的文件夹路径
% 获取文件夹中的所有图像文件
imageFiles = dir(fullfile(inputFolder, '*.jpg')); % 根据需要修改文件扩展名
% 如果输出文件夹不存在,创建输出文件夹
if ~exist(outputFolder, 'dir')
mkdir(outputFolder);
end
% 遍历每一个图像文件
for i = 1:length(imageFiles)
try
% 构建当前图像的完整路径
inputFilePath = fullfile(inputFolder, imageFiles(i).name);
% 读取当前图像
img = imread(inputFilePath);
% 显示当前图像并手动框选前景区域
figure, imshow(img);
h = imrect;
position = wait(h); % 用户手动选择前景区域,返回 [x, y, width, height]
% 确保 position 是一个 1x4 的数组,表示矩形框 [x, y, width, height]
ROI = round(position); % 取整后的矩形框
% 将 RGB 图像转换为 L*a*b* 颜色空间
X = rgb2lab(img);
% 创建空掩膜
BW = false(size(X, 1), size(X, 2));
% 将矩形框转换为逻辑掩膜
mask = false(size(BW)); % 创建与图像大小相同的逻辑矩阵
mask(ROI(2):(ROI(2) + ROI(4)), ROI(1):(ROI(1) + ROI(3))) = true; % 标记矩形框区域为 true
% 使用超级像素生成 L
L = superpixels(X, 61064, 'IsInputLab', true);
% 将 L*a*b* 颜色空间缩放到 [0, 1]
scaledX = prepLab(X);
% 使用 grabcut 进行图像分割
BW = BW | grabcut(scaledX, L, mask, [], []);
% 生成掩膜图像
maskedImage = img;
maskedImage(repmat(~BW, [1, 1, 3])) = 0;
% 构建输出文件路径
[~, fileName, ext] = fileparts(imageFiles(i).name);
outputFilePathBW = fullfile(outputFolder, [fileName '_BW' ext]); % 保存二值图像
outputFilePathMasked = fullfile(outputFolder, [fileName '_masked' ext]); % 保存掩膜图像
% 保存分割结果
imwrite(BW, outputFilePathBW); % 保存二值图像
imwrite(maskedImage, outputFilePathMasked); % 保存掩膜图像
% 显示保存成功提示
disp(['图像已保存到: ', outputFilePathMasked]);
% 关闭图像窗口
close all;
catch ME
disp(['处理图像时出错: ', imageFiles(i).name]);
disp(ME.message);
close all;
end
end
% 用于 L*a*b* 颜色空间的预处理函数
function out = prepLab(in)
% 将 L*a*b* 颜色空间的范围转换到 [0, 1]
out = in;
out(:, :, 1) = in(:, :, 1) / 100; % L 范围是 [0 100]
out(:, :, 2) = (in(:, :, 2) + 86.1827) / 184.4170; % a* 范围 [-86.1827,98.2343]
out(:, :, 3) = (in(:, :, 3) + 107.8602) / 202.3382; % b* 范围 [-107.8602,94.4780]
end
2.运行效果(以马铃薯为例)
框选图像
输出: