手动框选区域批量分割图像(Matlab)

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.运行效果(以马铃薯为例)

框选图像

 输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我本將心向明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值