You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于阈值的MATLAB图像分割:像素位置选取与区域提取代码实现问询

完善MATLAB图像分割函数的实现

我来帮你搞定这个图像分割函数的核心逻辑!先拆解下你的需求:对输入图像按列求和,筛选出总强度超过128的列,然后提取原图像中这些列对应的区域,还要把结果存入预设的5个元素的cell数组里。

先修正你代码里的小问题,再逐步完善核心逻辑:

1. 正确获取符合条件的列位置

sum(im) 默认是沿列求和(维度1),会得到一个1×n的向量,每个元素对应一列的总像素强度。要找出总强度大于128的列索引,直接用find函数即可:

S_position = find(S_sum > 128);

这里得到的S_position是一个数组,存储了所有符合阈值条件的列的下标(比如第3、5、7列符合条件,就会返回[3,5,7])。

2. 提取对应区域并存储到cell数组

你的代码里写了循环for kk = 1:nrofsegments,推测你是想把筛选后的列平均分成5个片段存入cell数组。那需要先把符合条件的列索引拆分,再分别提取对应区域:

% 把符合条件的列索引拆成5份
segment_cols = mat2cell(S_position, 1, repmat(ceil(length(S_position)/nrofsegments), 1, nrofsegments));
% 提取对应片段的图像区域
S{kk} = im(:, segment_cols{kk});

如果你的需求只是提取所有符合条件的列(不需要拆分),那直接取原图像的所有行和这些列即可:S{kk} = im(:, S_position);

完整修正后的函数代码

我还加了一些优化和边界判断,避免重复计算和空值报错:

function S = image_segment(im) 
% im is the image to segment 
nrofsegments = 5; % there is 5 fragments for this image 
S = cell(1,nrofsegments); 
m = size(im,1); 
n = size(im,2); 

% 先对整幅图像按列求和(只需要算一次,不用放在循环里!)
S_sum = sum(im, 1); % 明确指定维度1,避免RGB图像求和出错
% 找出总强度大于128的列位置
S_position = find(S_sum > 128);

% 边界判断:如果没有符合条件的列,返回空cell并提示
if isempty(S_position)
    warning('No columns meet the threshold condition!');
    return;
end

% 把符合条件的列拆分成5个近似相等的片段
segment_cols = mat2cell(S_position, 1, repmat(ceil(length(S_position)/nrofsegments), 1, nrofsegments));

for kk = 1:nrofsegments 
    % 提取对应片段的图像区域
    S{kk} = im(:, segment_cols{kk});
    % 可选:显示每个分割后的片段
    figure; imshow(S{kk}); title(['Segment ', num2str(kk)]);
end
end

关键细节说明

  • 我把sum(im)移到了循环外面,因为整幅图像的列求和只需要计算一次,放在循环里会重复计算浪费资源。
  • 用sum(im, 1)明确指定沿列求和,避免输入是RGB图像时,默认求和逻辑导致的错误。
  • 增加了空值判断,如果没有列符合阈值,会给出警告并提前返回,避免后续代码报错。

内容的提问来源于stack exchange,提问作者vashista

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:17:44