一般的に、この問題を解決するには、検索エンジンが間違いなく最適な方法です。 しかし、StatisticsとMachine Learning Toolboxがないので、MATLABのbwdist関数を試すことができます。
bwdist関数は、基本的に距離変換であり、ある点からの距離のマップを返すこともできます。 bwdistの2番目のパラメータは、使用する距離関数のタイプを定義します(デフォルトの距離関数はユークリッド)。
例:
%inputMat is the original matrix
inputMat = ones(10,10);
%(Px,Py) is the point to calculate the distance from
Px = 5; Py = 5;
%calls bwdist
tempMat = false(size(inputMat));
tempMat(Py,Px) = true;
distMat = bwdist(tempMat);
%search for neighbour pixels
neigbourPixels = distMat < D(Px,Py);
[Y, X] = ind2sub(size(neigbourPixels),find(neigbourPixels));
%prints result
[Y,X]
結果:
ans =
4 4
5 4
6 4
4 5
5 5
6 5
4 6
5 6
6 6
ランタイムの最適化
この方法の欠点は、あなたが多く、それを呼び出す場合bwdistの計算時間が遅くなるかもしれないということです回。
第1段階:次のように
は大きな行列に、一度だけの距離マップを計算します。ランタイムが重要である場合そのため、私は、次の最適化を提案
N = max(size(inputMat));
tempMat = false(N,N);
tempMat(N/2,N/2) = true;
distMatInitial = bwdist(tempMat);
第二段階:
新しいポイント(Px、Py)を指定したい場合は、distMatInitialの中心からパッチをコピーするだけで、再度bwdistを呼び出さずに距離マップを計算します。
Mp = 30; %determines maximal patch size
distsMapFromPxPy = zeros(size(inputMat));
distsMapFromPxPy(Py-Mp:Py+Mp,Px-Mp:Px+Mp) = distMatInitial(N/2-Mp,N/2+Mp,N/2-Mp:N/2+Mp);
*この例のようなエッジケースを処理しないことに注意してください:あなたは、このアプローチを試みることを選択した場合
(1)(Py-Mp)<0 (2)(Py+Mp)>m (3)(Px-Mp)<0 (4)(Px+Mp)>n
したがって、これらのケースを処理することを忘れないでください。