Выполнение разреженной матрицы NxM с указанием соседних пикселей - PullRequest
0 голосов
/ 21 февраля 2020

Моя цель - создать разреженную матрицу NxM, указывающую, какие M пикселей являются соседями каждого пикселя N. Для этой цели я создал следующий скрипт:

close all; clear; clc;

Image = imread('image0100.jpg');
[X,Y] = meshgrid(1:size(Image,2),1:size(Image,1));
px = [X(:)';Y(:)';ones(1,length(X(:)))];

neighbors = sparse(numel(Image)/3,numel(Image)/3);

aux = 0;
ind = 1:8;
ind_A1 = 1:length(px);
for i=1:max(px(1,:))
    if (i==2)
        aux = aux+1;
    end
    for j=1:max(px(2,:))
        x = zeros(2,8);
        x(:,1) = [i-1;j-1];
        x(:,2) = [i-1;j];
        x(:,3) = [i-1;j+1];
        x(:,4) = [i;j-1];
        x(:,5) = [i;j+1];
        x(:,6) = [i+1;j-1];
        x(:,7) = [i+1;j];
        x(:,8) = [i+1;j+1];

        ind_del = ind(x(1,:)<1 | x(2,:)<1 | x(1,:)>max(px(1,:)) | x(2,:)>max(px(2,:)));
        x(:,ind_del) = [];

        for k=1:length(x)
            idx = ind_A1(px(1,:)==x(1,k) & px(2,:)==x(2,k) & ind_A1>=aux+j);
            neighbors(aux+j,idx) = 1;
        end
    end
    aux = aux+max(px(2,:));
end           

save('neighbors.mat','neighbors');

Однако этот код довольно медленный, так как это изображение размером 964x1296 и из-за того, что я приписываю только один элемент разреженной матрице за каждую итерацию l oop.

Мой вопрос: как я могу улучшить эффективность этого кода?

Примечание: мне нужна разреженная матрица, так как эта матрица слишком велика.

Примечание2: Мне нужно только верхняя матрица tri angular. Это причина, почему я ищу, что: ind_A1>=aux+j.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...