Получение пространственных диапазонов или срезов из 2d матрицы или изображения

Я хотел бы пометить и назвать части изображения в следующем формате, поскольку я использовал до сих пор для 4 блоков на 1024 квадратных изображения. Хотя есть несколько путей, которые можно использовать, которые включают в себя множество циклов, я ищу эффективный способ обобщить его для изображений разного размера с блоками разной длины без потери меток.

Я также хотел бы объединить их после выполнения некоторых операций.

Кроме того, запрашиваемые блоки всегда будут квадратными, длина всегда будет полностью пропорциональна исходному изображению. Другими словами, я не буду пытаться разделить изображение 1024x1024 на блоки 612x612. Но я могу хотеть разделить его на 512x512 блоков, как в следующем сценарии, или 256,128,64,..

Диапазоны разрезов являются статическими и служат только для 4 блоков, имеющих 512 квадратных размеров. Я хочу избежать циклов и дополнительных поисков.

Вот сценарий, который я использую до сих пор:

function y=img_divider(z,img_block)

%divides the input image into 4 blocks of the following composition for 1024x1024 inputs. Returns the block called with img_block. 
% | 1 | 2 |
% |---|---|
% | 3 | 4 |

if img_block==1
y=z(1:512,1:512,:);
end
if img_block==2
y=z(1:512,513:1024,:);
end
if img_block==3
y=z(513:1024,1:512,:);
end
if img_block==4
y=z(513:1024,513:1024,:);
end

return;

То, что я хочу развить с помощью этого вопроса, будет похоже на:

function y=img_divider(z,img_block,n)

% | 1 | ... | sqrt(n) |
% |---|---|...|
% |...|...|...|
% |...| ... |n |

bs=size(z,1)/sqrt(n)
if img_block==1
y=z(1:bs,1:bs,:);
end
...
...
if img_block==n
y=z(size(z,1)-bs+1:size(z,1),:),size(z,1)-bs+1:size(z,1),:);
end

1 ответ

Решение

Попробуй это -

function y=img_divider(z,img_block,n)

n2 = sqrt(numel(z)/n);
block_lens = n2*ones(1,size(z,1)/n2);
t1 = mat2cell(z,block_lens,block_lens)'; %%//'
y = cell2mat(t1(img_block));

return;
Другие вопросы по тегам