バイナリ イメージに破損した線分がいくつかあり、それらを修正する必要があります (線分をまっすぐにし、元の太さにします)。そのためには、セグメントの中間点を見つける必要があるため、近傍をチェックして線の太さを見つけると、ピクセルが 1 でなくなって 0 になる場所を見つけることができます。
3 に答える
損傷した線分が直線であると仮定すると、MATLAB で regionprops を使用して各境界ボックスの中心を見つけることができます。セグメントが直線の場合、それは常にバウンディング ボックスの対角線であるため、ボックスの中心はセグメントの中心でもあります。
あいまいさを減らすために、点 A と B を A(Xa, Ya) と B(Xb, Yb) と呼びましょう。
中点を C とします。
C(Xc, Yc)
Xc = (Xa + Xb) / 2
Yc = (Ya + Yb) / 2
X 座標に 2 つ、Y 座標に 2 つの興味深い数字が 4 つあります。
Xmin = floor(Xc)
Xmax = ceil(Xc)
Ymin = floor(Yc)
Ymax = ceil(Yc)
中点の X 座標は Xmin または Xmax のいずれかであり、中点の Y 座標は Ymin または Ymax のいずれかです。
したがって、4 つの潜在的なポイントがあります(Xmin, Ymin), (Xmin, Ymax), (Xmax, Ymin), (Xmax, Ymax)
。
したがって、最後に、どの点が C に最も近いかを決定する必要があります。
P(Xp, Yp) から C(Xc, Yc) までの距離は次のとおりです。
sqrt(sqr(Xp - Xc) + sqr(Yp - Yc))
4 つの点から C までの 4 つの距離を計算し、最小値を選択すると、それが可能な限り最良の中間点になります。
仮定する
A = [xa ya];
B = [xb yb];
それから
C = round( mean([A;B]) );
Matlabround
では数値が最も近い整数に丸められるため、これにより、解析中心 ( mean([A;B])
) から最も近いピクセルまでの (都市ブロック) 距離が最小化されます。
サブピクセル精度を維持したい場合 (これは、結果からピクセル インデックスへの明示的なマップが必要になるまで、ほとんどの計算で実際に推奨されます)、単に を削除して、round
その部分のみを使用しますmean
。