2016-06-28 3 views
0

Я разделил изображение 512X512 на 2X2 пиксельные блоки. Таким образом, у меня есть 65536 блоков. Каждый блок имеет четыре пикселя.Как перемещаться изображение по блокам случайным образом?

Image divided into blocks like this

Теперь я хочу, чтобы пройти изображение в случайном порядке. Например, начиная с 6-го блока, затем до 3-го блока, затем до 8-го, затем до 1-го блока ... так, пока не пройдет весь образ.

Важно: Мне нужно сохранить порядок перемещения для последующего использования.

Пожалуйста, помогите мне написать код MATLAB для этого. Многое много спасибо заранее.

+2

Определить _traverse_: что вы хотите делать с каждым блоком? –

+0

, в каком формате находится изображение, и у вас уже есть отдельные блоки в Matlab? – Finn

+0

Спасибо. Перемещение означает переход от одного блока к другому, пока не будут достигнуты все блоки. После доступа к каждому блоку я сделаю некоторую операцию над этим блоком, а затем перейду в другой блок. Я могу проходить или сканировать по блокам в порядке растрового сканирования. Но не в случайном порядке :-( – matlabcoder

ответ

1

Easy, давайте пример с небольшой матрицей (6x6)

Im = rand(6,6); 
nblocks = 9; 
blocksize = 2; 

Вы будете иметь блоки размером 2х2 (всего 3х3 = 9 блоков). Измените матрицу на матрицу 2 x 18.

Im = reshape(Im, numel(Im)/blocksize, blocksize); 

Теперь генерировать случайную перестановку индексов, разделенных по размеру блока:

idx = randperm(nblocks) * blocksize; 

вуаля. Теперь вы можете получить доступ только к 5-му блоку:

currentblock = Im(idx(5):idx(5)+blocksize, :); 

Используйте петлю для поперечного перемещения каждого блока.

+0

Спасибо. Перемещение означает переход от одного блока к другому до тех пор, пока не будут достигнуты все блоки. После доступа к каждому блоку я сделаю некоторую операцию над этим блоком, а затем перейду к другому блоку. – matlabcoder

+0

можно использовать циклы? – matlabcoder

+0

мы можем использовать циклы для сканирования или прохождения в случайном порядке. Потому что мне нужно сохранить порядок перемещения для последующего использования. – matlabcoder

1

Вы можете разделить изображение на блоки и пометить их по третьему размеру, используя this great answer. Затем вы перебираете случайную перестановку индексов третьего измерения:

A = randn(12,12); 
m = 3; 
n = 6; 
T = permute(reshape(permute(reshape(A, size(A, 1), n, []), [2 1 3]), n, m, []), [2 1 3]); 
% each third-dim slice is an mxn block 
scan_order = randperm(size(T,3)); % random permutation of block indices 
for b = scan_order 
    block = T(:,:,b); 
    % Do stuff with current block 
end 
Смежные вопросы