如何在Matlab图像分割代码中避免使用fliplr函数?
避免在MATLAB图像分割代码中使用
fliplr的优化方案 完全可以去掉fliplr!你的核心需求是从中间向两侧保留指定百分比的有效列,原来的反转操作其实是绕了个弯——我们可以直接通过索引计算得到目标位置,不需要反转数组。
先理清楚原逻辑的本质:
- 左侧保留:从最左有效列
left_idx开始,向中间保留keepPercent比例的列 - 右侧保留:从最右有效列
right_idx开始,向中间保留keepPercent比例的列
基于这个逻辑,我们可以直接计算出需要保留的索引范围,完全不需要反转操作。优化后的代码如下:
img1 = imread('sample4.png'); keepPercent = 0.9; % 两侧各保留90%的有效列 % 找到所有非零列的边界 columnsWithAllZeros = all(img1 == 0); left_idx = find(~columnsWithAllZeros,1,'first'); right_idx = find(~columnsWithAllZeros,1,'last'); cent_idx = floor(mean([left_idx,right_idx])); % 计算左侧保留的索引:从left_idx开始,取前keepPercent的左侧到中间的列 left_to_cent_len = cent_idx - left_idx + 1; num_leftKeep_idxs = floor(keepPercent * left_to_cent_len); right_keepImg_idxs = left_idx : left_idx + num_leftKeep_idxs - 1; % 计算右侧保留的索引:从right_idx往前数keepPercent的中间到右侧的列 cent_to_right_len = right_idx - cent_idx; num_rightKeep_idxs = floor(keepPercent * cent_to_right_len); left_keepImg_idxs = (right_idx - num_rightKeep_idxs + 1) : right_idx; % 生成左右分割后的图像 [nrow, ncol] = size(img1); leftBrain_img = zeros(nrow, ncol, 'logical'); rightBrain_img = zeros(nrow, ncol, 'logical'); leftBrain_img(:, left_keepImg_idxs) = img1(:, left_keepImg_idxs); rightBrain_img(:, right_keepImg_idxs) = img1(:, right_keepImg_idxs); % 转换格式并叠加原图像(和原逻辑一致) leftBrain_img = cast(leftBrain_img,'uint16') .* img1; rightBrain_img = cast(rightBrain_img,'uint16') .* img1; % 可视化结果 figure, subplot(131), imshow(img1,[]), title('Original Image') subplot(132), imshow(rightBrain_img,[]), title('Right Brain Segment') subplot(133), imshow(leftBrain_img,[]), title('Left Brain Segment')
优化说明
直接计算索引范围:
- 左侧保留的列:从
left_idx开始,连续取num_leftKeep_idxs列,完全等价于原逻辑中left_to_cent_idxs(1:num_leftKeep_idxs)的结果 - 右侧保留的列:从
right_idx - num_rightKeep_idxs + 1到right_idx,这和原逻辑中先反转cent_to_right_idxs取前num_rightKeep_idxs个、再反转回来的结果完全一致,彻底摆脱了fliplr依赖
- 左侧保留的列:从
代码更直观:
去掉反转操作后,代码逻辑和业务需求直接对应——左侧从左往中间留,右侧从右往中间留,读起来更清晰,也减少了不必要的数组操作开销。
内容的提问来源于stack exchange,提问作者Gopi




