2016-04-10 20 views
0

Matlabを使用してAdaptive Watershed Segmentationを実装したいと思います。このアルゴリズムで2次元配列の各要素の指定された距離内にあるすべての近傍を見つける

1つのステップは次のとおりです

画素によってマーカーマップピクセルをスキャン。 M(x0、y0)が1であれば、半径D(x、y)でその近傍の疑似最大値を求める。

DおよびMはすべて2次元アレイです。

2次元配列の各要素の指定距離内にあるすべての近傍を見つけることができる関数はありますか?

私はrangesearch()を使用することができませんでしたので、私の問題を解決できる用量は分かりません。

ありがとうございます!

答えて

0

一般的に、この問題を解決するには、検索エンジンが間違いなく最適な方法です。 しかし、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 

したがって、これらのケースを処理することを忘れないでください。

関連する問題