Matlab 如何在下面的代码中避免fliplr?
我试图将图像中的一个区域分成左右两部分。但我要避免在每一边的中心有一定比例的柱子 所以, 我必须得到左侧和右侧的keep索引 我正在使用Matlab 如何在下面的代码中避免fliplr?,matlab,image-processing,Matlab,Image Processing,我试图将图像中的一个区域分成左右两部分。但我要避免在每一边的中心有一定比例的柱子 所以, 我必须得到左侧和右侧的keep索引 我正在使用fliplr反转右侧的数组索引 获取(1:n_指数) 然后再次fliplr恢复正常 在以下代码中,我是否可以避免fliplr: img1 = imread('sample4.png'); keepPercent = 0.9; %90 on both sides columnsWithAllZeros = all(img1 == 0); left_idx = f
fliplr
反转右侧的数组索引
获取(1:n_指数)
然后再次fliplr
恢复正常
在以下代码中,我是否可以避免fliplr
:
img1 = imread('sample4.png');
keepPercent = 0.9; %90 on both sides
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_to_cent_idxs = left_idx:cent_idx;
cent_to_right_idxs = cent_idx+1:right_idx;
cent_to_right_idxs = fliplr(cent_to_right_idxs); % flip
num_leftKeep_idxs = floor(keepPercent *length(left_to_cent_idxs));
num_rightKeep_idxs = floor(keepPercent *length(cent_to_right_idxs));
right_keepImg_idxs = left_to_cent_idxs(1:num_leftKeep_idxs);
left_keepImg_idxs = cent_to_right_idxs(1:num_rightKeep_idxs);
left_keepImg_idxs = fliplr(left_keepImg_idxs); %flip back This is not needed I Know
[leftBrain_img, rightBrain_img] = deal(zeros(nrow, ncol, 'logical'));
leftBrain_img(:,left_keepImg_idxs) = img1(:,left_keepImg_idxs);
rightBrain_img(:,right_keepImg_idxs) = img1(:,right_keepImg_idxs);
rightBrain_img = cast(rightBrain_img,'uint16') .*img1;
leftBrain_img = cast(leftBrain_img,'uint16') .*img1;
figure,
subplot(131), imshow(img1,[])
subplot(132), imshow(rightBrain_img,[])
subplot(133), imshow(leftBrain_img,[])
示例图像可用
谢谢
Gopi这是可以做到的,就像@rahnema1所说的那样。但问题是,如果可以用一种更快更简单的方式来做,为什么还要这样做呢! 看看这个代码-
img1 = imread('sample4.png');
keepPercent = 0.9; %90 on both sides
columnsWithAllZeros = all(img1 == 0);
leavepercent=1-keepPercent;
idx=minmax(find(columnsWithAllZeros==0));
cent_idx = floor(mean(idx));
left_keepImg_idxs1=idx(1):cent_idx-floor(leavepercent*(cent_idx-idx(1)+1));
right_keepImg_idxs1=cent_idx+1+floor(leavepercent*(idx(2)-cent_idx+1)):idx(2);
[leftBrain_img, rightBrain_img] =deal(zeros(512, 512, 'logical'));
leftBrain_img(:,left_keepImg_idxs1) = img1(:,left_keepImg_idxs1);
rightBrain_img(:,right_keepImg_idxs1) = img1(:,right_keepImg_idxs1);
rightBrain_img = cast(rightBrain_img,'uint16') .*img1;
leftBrain_img = cast(leftBrain_img,'uint16') .*img1;
figure,
subplot(131), imshow(img1,[])
subplot(132), imshow(rightBrain_img,[])
subplot(133), imshow(leftBrain_img,[])
您是否尝试过
cent_to_right_idxs=right_idx:-1:cent_idx+1代码>?@rahnema1,它能工作,谢谢。我想看看Matlab是否有类似于num_list[-9:]
的numpy等价物,你建议的调整解决了我的问题,这就是我想要的,但你的答案看起来更可读,left_keepImg_idxs=cent_to_right_idxs(end-num_rightKeep_idxs+1:end)
你可以使用这个num_列表(end-9+1:end)
与示例相同。它的工作原理与预期相同,但我想看看是否可以像numpy一样从末尾进行索引<代码>数字列表[-9::]