2016-06-02 2 views
0

У меня есть изображение и пиксель нескольких крупных объектов в этом изображении, определенных с помощью regionprops. Теперь я хочу создать новое изображение, которое содержит только один объект, размер которого изменяется до размера объекта. Так что я делаюМатрица Matlab как индекс для матрицы

rawimage = imread('testfile.tif'); 
processimage = squeeze((sum(rawimage,3))'); 
IMAGE_labeled = bwlabel(processimage,8); 
shapedata=regionprops (IMAGE_labeled,'Area','PixelList'); 
index = find ([shapedata.Area]>5000); 

for i = 1:length(index) 
    ix = shapedata(index(i)).PixelList(:,1); 
    iy = shapedata(index(i)).PixelList(:,2); 
    newimage = zeros(max(ix)-min(ix)+1,max(iy)-min(iy)+1,3); 
    for im = 1:length(ix) 
     newimage(ix(im)-min(ix)+1,iy(im)-min(iy)+1,:) = rawimage(ix(im),iy(im),:); 
    end 
    newimage = uint8(newimage); 
    imwrite(newimage,'myimage.tif','tif') 
end 

Кто-нибудь идея, как я могу векторизации второй цикл, чтобы ускорить весь код вверх? В конечном итоге возникает вопрос, как использовать два вектора в качестве индекса в матрице.

Я нашел

Vc = num2cell([ix,iy]) 
rawimage(sub2ind(size(rawimage),Vc{i,:})) 

, но это опять-таки требует цикл, чтобы пройти через все индексы Vc, как я не могу использовать

rawimage(sub2ind(size(rawimage),Vc)) 

Спасибо за ваши предложения

ответ

2

Поскольку изображение имеет в третьем измерении, вам нужно сначала изменить его на массив [M*N x 3]. Затем вы можете использовать sub2ind, как вы показали.

for k = 1:numel(shapedata) 
    % Flip the PixelList so it's row/column rather than x/y 
    list = fliplr(shapedata(k).PixelList); 

    % Figure out the extents of the PixelList values 
    minima = min(list, [], 1); 
    maxima = max(list, [], 1); 

    % Grab a square of the image containing the object of interest 
    subimage = rawimage(minima(1):maxima(1), minima(2):maxima(2),:); 

    % Store the size 
    sz = size(subimage); 

    % Convert the PixelList values to linear indices within this sub-image 
    inds = sub2ind(sz(1:2), bsxfun(@minus, list, minima - 1)); 

    % Reshape so that we can index into the first two dimensions at the same time 
    subimage = reshape(subimage, [], size(subimage, 3)); 

    % Now create the output which is all zeros, but then we grab the values that are 
    % in PixelList and set them within the new matrix. 
    newimage = zeros(size(subimage)); 
    newimage(inds,:) = subimage(inds,:); 

    % Reshape the result to be the expected dimension 
    newimage = reshape(newimage, sz); 
end 
+0

Thx thats быстрее. Проблема в том, что некоторые объекты перекрываются, если я использую поле. Таким образом, часть одного объекта будет в новом изображении другого объекта ... – horseshoe

+0

@horseshoe Извините, я неправильно прочитал ваш код. Я обновлю. – Suever

+0

@ Авторское обновление. – Suever

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