You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在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')

优化说明

  1. 直接计算索引范围

    • 左侧保留的列:从left_idx开始,连续取num_leftKeep_idxs列,完全等价于原逻辑中left_to_cent_idxs(1:num_leftKeep_idxs)的结果
    • 右侧保留的列:从right_idx - num_rightKeep_idxs + 1right_idx,这和原逻辑中先反转cent_to_right_idxs取前num_rightKeep_idxs个、再反转回来的结果完全一致,彻底摆脱了fliplr依赖
  2. 代码更直观
    去掉反转操作后,代码逻辑和业务需求直接对应——左侧从左往中间留,右侧从右往中间留,读起来更清晰,也减少了不必要的数组操作开销。

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

火山引擎 最新活动