基于阈值的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
相关产品推荐
相关产品推荐

