2014-01-23 2 views
0

В Matlab У меня есть 3D-матрица (более 100 кадров 512x512). Моя цель - найти некоторые репрезентативные точки через всю гиперматрицу. Для этого я применил традиционный (и не очень эффективный) метод: я подразделяю большую матрицу на более мелкие субматрицы, а затем я ищу пиксель с самым высоким значением. После этого я изменяю эти относительные координаты этого самого пикселя в подматрице на глобальные координаты, относящиеся к большой матрице.Найти максимальный пиксель с помощью BLOCKPROC в Matlab

Теперь я перепроектирую алгоритм. Я видел, что для того, чтобы анализировать большую матрицу поблочно (это на самом деле то, что я делаю с моим старым алгоритмом), функция BLOCKPROC очень эффективна. Я прочитал документацию, но не знаю, как реализовать функцию «fun», чтобы извлечь пиксель с максимальным значением каждого блока. Заранее спасибо.

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

+1

Я не совсем уверен, чего вы хотите достичь. Почему вы не используете функцию max() для каждого кадра? А затем используйте find() и ind2sub(). Как в этой теме: http://www.mathworks.com/matlabcentral/newsreader/view_thread/170759 – hesar

+0

, потому что в каждом фрейме есть несколько из тех пунктов, которые я ищу. Слишком долго объяснять ... Вкратце: у меня есть изображения (3D-стек) из микроскопа, в котором много волокон (волокон коллагена). Я должен найти несколько точек (несколько пикселей в каждом кадре) и после этого интерполировать точки и восстановить волокна. Эти точки называются очками нуклеации, лучший способ их найти - это сделать то, что я объяснил в вопросе. – karl71

+0

Я думаю, довольно просто, что я пытаюсь сделать. Разделите изображение на более мелкие изображения и получите координаты (по отношению к глобальному изображению) максимального пикселя каждого из этих меньших изображений. – karl71

ответ

5

Сначала определим функцию, чтобы определить местоположение максимума (суб) матрицы:

function loc = max_location(M); 
[~, ii] = max(M(:)); 
[r c] = ind2sub(size(M),ii); 
loc = [r c]; 

Затем использовать

blockproc(im, blocksize, @(x) x.location+max_location(x.data)-1) 

где im ваше изображение (2D массив) и blocksize является вектор 1x2, определяющий размер блока. В поле blockproc поле data является подматрицей (которое вы переходите на max_location), а поле location содержит координаты верхнего левого угла подматрицы (которую вы добавляете к результату max_location, минус 1).

Пример:

>> blocksize = [3 3]; 

>> im = [ 0.3724 0.0527 0.4177  0.6981 0.0326 0.4607 
      0.1981 0.7379 0.9831  0.6665 0.5612 0.9816 
      0.4897 0.2691 0.3015  0.1781 0.8819 0.1564 

      0.3395 0.4228 0.7011  0.1280 0.6692 0.8555 
      0.9516 0.5479 0.6663  0.9991 0.1904 0.6448 
      0.9203 0.9427 0.5391  0.1711 0.3689 0.3763 ]; 

>> blockproc(im, blocksize, @(x) x.location+max_location(x.data)-1) 

ans = 
    2  3  2  6 
    5  1  5  4 

означает ваш блок максимумы расположены в точке с координатами (2,3), (5,1), (2,6) и (5,4)

+0

Ничего себе !! Спасибо огромное! – karl71

+0

Как применить этот алгоритм к многомерной матрице (x, y, z), а не только к одному кадру? (Я хотел бы иметь размер блока [3 3 3]) – karl71

+0

'blockproc' предназначен только для 2D, насколько мне известно. Возможно, вы могли бы изменить 3D-массив в 2D-массив, а затем вы можете применить «blockproc» –

0

сложная часть с дескриптором функции «fun» заключается в том, что она относится к субблокам, которые являются структурой, это объект с одним или несколькими полями и одно или несколько значений, соответствующих каждому из полей.

Значения ваших субблоков сохраняются в поле под названием «данные», так что вызов функции

@(x)max(x) 

не хватает, в этом случае правильная версия, что это

@(x)max(x.data) 

2D-пример того, что вы ищете, будет выглядеть так:

a=magic(4); 

b=blockproc(a,[2,2],@(x) find(x.data==max(max(x.data)))); %linear indexes 

выходы

a = 

    16  2  3 13 
    5 11 10  8 
    9  7  6 12 
    4 14 15  1 


b = 

    1  3 
    4  2 

b являются линейными показателями каждого субблока, так что значения 16, 13, 14, 15 в a.

Надеюсь, что это поможет!

1

Другая возможность - использовать im2col для каждого кадра.Если I ваш кадр (512512):

% rearranges 512 x 512 image into 4096 x 64 
% each column of I2 represents a 64 x 64 block 
n = 64; 
I2 = im2col(I,[n,n],'distinct'); 

% find max in each block 
% ~ to ignore that output 
[~,y] = max(I2); 

% convert those values to overall indices 
ind = sub2ind(size(I2),y, 1:n); 

% create new matrix 
I3 = zeros(size(I2)); 
I3(ind)=1; 
I3 = col2im(I3,[n,n],size(I),'distinct'); 

I3 должно теперь быть изображение того же размера ввода I, но со всеми нулями для расположения точек максимума в каждой подматрицы кроме.

Смежные вопросы