画像の品質が非常に低いため、非常に困難ですが、次のように反復グローバルしきい値アプローチを試すことができます。
- 初期推定しきい値 T をランダムに選択します (通常は平均値として)。
- T を使用して信号をセグメント化すると、2 つのグループが生成されます。G1 は値 <=T のすべてのポイントで構成され、G2 は値>T のポイントで構成されます。
- G1 と T の点と G2 と T の点の間の平均距離を計算します。
- 新しいしきい値 T=(M1+M2)/2 を計算します。
- T の変化が十分に小さくなるまで、手順 2 ~ 4 を繰り返します。
トリックは、画像全体に適用するのではなく、画像を(たとえば)5x5のブロックに分割し、ブロックに個別に適用することです。これにより、次のようになります。
以下は、再現できると確信しているRでの実装です
getT = 関数(y){
t = 平均 (y)
mu1 = 平均 (y[y>=t])
mu2 = 平均 (y[y 1){
cmu1 = 平均(y[y>=t])
cmu2 = mean(y[y 1 & cmu1 == mu1 & cmu2 == mu2){
print(paste('done t=', t))
リターン(t)
壊す;
}そうしないと{
mu1 = cmu1
mu2 = cmu2
t = (ミュー1 + ミュー2)/2
print(貼り付け('new t=', t))
}
i = i+1
}
}
r = seq(1, nrow(画像), by=5)
c = seq(1, ncol(画像), by=5)
r[長さ(r)] = nrow(画像)
c[長さ(c)] = ncol(画像)
y = 画像
for(i in 2:length(r) ){
for(j in 2:length(c) ){
ブロック = 画像[r[i-1]:r[i]、c[j-1]:c[j]]
t = getT(ブロック)
y[r[i-1]:r[i], c[j-1]:c[j]] = (ブロック>t)+0
}
}
ディスプレイ (y)