Моя цель - создать разреженную матрицу 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
.