@beaker 和@Cris 是正确的,但只是为了增加一些风味,我尝试演示另一种方法 - 使用线性索引,它可以教授关于 MATLAB 中二维数组的列主要索引的有趣课程。
需要注意的另一点是,这种过程是接缝雕刻算法所遵循的,我们以这种方式去除垂直接缝。
加载一个测试图像来运行它 - 裁剪它以便于分析。
I = imread('peppers.png');
I = I(100:100+9, 100:100+19, :);
figure, imshow(I)
创建一个掩码,指示要删除哪些像素。这模拟了我认为您指向的条件 - 在这种情况下,我们为要删除的每一行选择随机列索引。您可能会将这些信息作为输入。
mask = zeros(size(I, [1:2]), 'logical');
for idx = 1:size(mask, 1)
randidx = randi(size(mask, 2));
mask(idx, randidx) = 1;
end
figure, imshow(mask)
使用列主要线性索引技巧来更快地进行删除!由于我们一次删除一列,我们将图像旋转 90 度,并将此问题转换为一次删除一行。 MATLAB 是“垂直”索引的,因此我们可以使用线性索引来简单地一次性移除所有被遮罩的像素(而不是一次一行/一列),然后使用 reshape 恢复形状,最后旋转回原来的形状方向。
It = rot90(I);
maskt = rot90(mask);
% Preallocate output
Ioutput = zeros([size(I, 1), size(I, 2) - 1, size(I, 3)], 'like', I);
for nchannel = 1:3
Icropped = It(:, :, nchannel);
% MATLAB indexes column wise - so, we can use linear indexing to make
% this computation simpler!
Icropped = Icropped(maskt(:) == 0);
Icropped = reshape(Icropped, [size(maskt, 1) - 1, size(maskt, 2)]);
% Restore the correct orientation after removing element!
Icropped = rot90(Icropped, 3);
Ioutput(:, :, nchannel) = Icropped;
end
figure, imshow(Ioutput)
我已经裁剪了“辣椒”图像来演示这一点,这样您就可以说服自己这样做是正确的。这种方法对于较大的图像也应该同样适用。