Вывод на вопрос
У меня есть двумерное комплексное изображение с коротким рядом значений.Я хочу сгруппировать похожие пиксели / сегментировать изображение.Существует одно более или менее статичное изображение с наложенным изображением, в котором есть несколько пятен, которые имеют изменяющиеся значения (в основном угол комплексного числа) в коротких сериях.Они также слегка различимы в норме изображения.
Моя первая попытка была k-means, но она действительно сгруппирована по средним (есть различия в средних значениях, особенно по сравнению с окружающими пикселями, новременная и угловая информация больше).Моя вторая попытка была ICA, и затем я посмотрел на k компонентов с наибольшей величиной, и это успешно идентифицировало определенные области в моем изображении как отличающиеся, но не идентифицировало группу пикселей, которые меня интересовали (визуально это не сложноузнаю их, но они маленькие).
Текущая ситуация
Так как мои первые две попытки не сработали, я огляделся сGoogle, и казалось, что спектральная кластеризация может быть уместным.Но у меня есть некоторые серьезные проблемы при использовании метода, в основном из-за ограниченной доступной памяти.Затем я подумал, что, поскольку у меня так много пикселей, я могу просто применить спектральную кластеризацию для отдельных блоков данных.
Кто-то здесь предлагает сначала кластеризовать плиты, а затем объединить их, затем он говорит«в конце у вас будет проблема их рекомбинации, и эту проблему легко решить».Биты, обозначенные как «легкие» в объяснениях, вряд ли когда-либо будут легкими, конечно.Он ссылается на эту статью, но этот метод не обрабатывает все данные в плитах.Это скорее исключает векторы, которые не близки к главному компоненту.
Вопрос
Мой вопрос состоит из 2 частей:
1 .Как мне объединить результаты для отдельных сегментов?Собственные векторы разные, а номера кластеров разные.Результат выглядит так, как будто он работал в отдельных плитах.
2 .Не учитывается расстояние / сходство между пикселями в отдельных плитах.Могу ли я сделать «плиты между плитами»?Для этих плит L и A не являются симметричными, не знаю, как выполнить метод тогда.Возможно, я смогу каким-то образом сравнить / объединить все собственные векторы в конце?
(3. Есть ли подобный или лучший метод, который не требует так много памяти. Время вычислений также гранично приемлемо, легко взрывается)
Пример кода Matlab
%% generate data
% get some outer region without data
tempdisk = strel('disk',922/2); tempdisk = double(repmat((1+sqrt(-1)).*tempdisk.Neighborhood,[1 1 15]));
% make some noise
tempnoise = (rand(921,921,15)+sqrt(-1).*rand(921,921,15))./10;
% 'background signal'
tempim1 = double(imresize(mean(imread('cameraman.tif'),3),[921,921])); tempim1 = repmat(tempim1./max(tempim1(:)),[1 1 15]);
% 'target signal'
tempim2 = double(rgb2hsv(imread('fabric.png'))); tempim2 = imresize(tempim2(:,:,2),[921,921]); tempim2 = repmat(tempim2./max(tempim2(:)),[1 1 15]);
sin1 = repmat(permute(sin(2.*pi.*(0:14)./15),[1 3 2]),[921 921 1]);
% combine into data
complexdata = (sin1.*(1.0.*tempim1+0.5.*tempim2.^2).*exp(-sqrt(-1).*2.*pi.*sin1.*(tempim2.^2)).*tempdisk+tempnoise)./1.5;
%this is what the mean data looks like
meannorm = mean(abs(complexdata),3);
meanangle = mean(angle(complexdata),3);
figure; subplot(1,2,1); imshow(meannorm,[]); title('mean norm'); subplot(1,2,2); imshow(meanangle,[]); title('mean angle')
Вот как выглядят сгенерированные данные:
Яркие пятна на правом изображении - это то, что я ищу.У них также самые сильные изменения во времени (и они коррелируются во времени).
Затем для настройки кластеризации:
%% perform spectral clustering in seperate slabs
% method from http://ai.stanford.edu/~ang/papers/nips01-spectral.pdf
%get all pixel vectors in a single matrix
complexrows = reshape(permute(complexdata, [3,1,2]), [15, 921*921]);
%k means and eigs dont accept complex, so convert to real here?
complexrowsTranspose = [real(complexrows);imag(complexrows)]';
%lets say 10000 by 10000 matrices are still ok
npix = 10000;
nslabpix = floor(length(complexrowsTranspose)/npix);
nrestpix = rem(length(complexrowsTranspose), npix);
Выполнение спектральной кластеризации в слябах, которые помещаются в память:
% spectral clustering
keig = 50;%how many eigenvectors needed? more is better
affinity_sigma = 1;% i dont understand how to calculate this from the paper
tic
% start with last slab (dynamically preallocate)
for islabpix = (nslabpix+1):-1:1;
%print progress
islabpix/nslabpix
toc
if islabpix>nslabpix
pixrange = (1:nrestpix) + ((islabpix-1)*npix);;
else
pixrange = (1:npix) + ((islabpix-1)*npix);
end
%calculate affinity between all voxels in slab
Aff = exp( -squareform(pdist(complexrowsTranspose(pixrange,:))).^2/(2*affinity_sigma^2) ); % affinity matrix
%calculate degree matrix for normalization
Dsq = sparse(size(Aff,1),size(Aff,2)); %degree matrix
for idiag=1:size(Aff,1)
Dsq(idiag,idiag) = sum(Aff(idiag,:))^(1/2);
end
%normalize affinity matrix
Lap = Dsq * Aff * Dsq; %normalize affinity matrix
%calculate eigenvectors of affinity matrix
[eigVectors(pixrange,1:keig), eigValues] = eigs(Lap, keig); %eigenvectors of normalized aff mat
normEigVectors(pixrange,1:keig) = eigVectors(pixrange,1:keig)./repmat(sqrt(sum(abs(eigVectors(pixrange,1:keig)).^2,2)), [1 keig]); %normalize rows of eigen vectors, normr only works on real numbers
% perform k means clustering on weights for eigenvectors
[idx,C,sumd,D] = kmeans([real(normEigVectors(pixrange,1:keig)),imag(normEigVectors(pixrange,1:keig))], 5); %k means on normalized eigenvecotrs
idxval(pixrange) = idx;
end
%reshape into image
idxim = reshape(idxval, [921, 921]);
figure; imshow(idxim,[])
toc
Получившаяся кластеризация:
Результат выглядит так, как будто метод работает до некоторой степени в каждой плите;цель состояла в том, чтобы объединить все капли с немного более высокой нормой и более сильным изменением угла (капли с высокой насыщенностью от tempim2
), которые кажутся узнаваемыми в результате.В настоящее время проблема состоит в основном в отдельных плитах, и в них нет кластеров перекрестных плит.Это заняло у моего компьютера около 15 минут.Я уменьшил количество собственных значений и размер изображения для этого примера, чтобы он работал за приемлемое количество времени.Я думаю, что это иллюстрирует часть моей проблемы.