Я занимаюсь проблемой k-соседей в MATLAB. Есть изображение со строкой r и столбцом c . И разделите его на r * c блоков - каждый blcok представляет патч с центром в каждом пикселе.
И я хочу найти k-ближайший соседний товар каждого blcok в пределах определенного диапазона поиска . Сначала я использую knnsearch
с kdTree
:
ns = createns(Block','nsmethod','kdtree');
[Index_nearest,dist] = knnsearch(ns,Block','k',k+1);
Однако я обнаружил, что он найдет k-ближайшую окрестность во всех блоках, а не в определенном диапазоне. Следовательно, есть ли другой способ достижения цели? Кто-нибудь может дать мне несколько советов? Заранее спасибо!
Редактировать: код для knnsearch:
function [Index_nearest, Weight] = Compute_Weight(Input, Options)
% Input the data and pre-processing
windowsize = Options.winsize;
k = Options.directionsize;
deviation = Options.deviation; % Deviation for Gaussian kernel
h = Options.h; % This parameter is for controling the weights
[r,c] = size(Input);
In_pad = padarray(Input, [windowsize windowsize], 'symmetric');
window_size = (2*windowsize+1)*(2*windowsize+1);
Block = zeros(window_size,r*c);
%% Split the input data into blocks
for i = 1:r
for j = 1:c
block = In_pad(i:i+2*windowsize,j:j+2*windowsize);
Block(:,r*(i-1)+j) = block(:); % expand from column to column
end
end
%% Find k-nearest neighbour blocks
% Create a KDtree with all local patches
ns = createns(Block','nsmethod','kdtree');
% Find the patches closest by in intensity in relation to the local patch itself
[Index_nearest,ddd] = knnsearch(ns,Block','k',k+1);
Index_nearest = Index_nearest';
Index_nearest = Index_nearest(2:k+1,:);
end