前提: -この画像は、0 (黒) と 1 (白) のみのバイナリ イメージと見なすことができます。-すべての繊維が直線で、始点と終点が境界線上にあります。・繊維の太さ(白線の太さ)の限界を知ることができます。
これらの仮定の下で:最初の白いピクセルに遭遇するまで、画像の境界線のスキャンを開始します(どこからでも、どの方向でも好きなところから始めてください...一貫性を保ちます)。この時点で、プログラムはこれが間違いなく開始点であることを理解します. これを知ることで、特定の制限 (またはしきい値) に達するまで、すべての白いピクセルを収集できます。ここでの考え方は、繊維がある場合、繊維と開始点が存在する境界線との間の角度を取得することです...もちろん、取得するピクセルが多いほど (取得する内側)、より確実に終わり。これは最もトリッキーな部分です。どういうわけか線で終わった後...角度を計算する必要があります(基本的な三角法)。開始点、画像の幅/高さ、および角度 (またはそれらの cos/sin) がわかっているので、終了点の正確な座標が得られます。注意してください... ここでの正確さは、cos/sin 値の計算エラーが発生する可能性があるため、実際には理解されていない可能性があります。したがって、しきい値をできるだけ長く保持する必要があります。したがって、終点は実際には点ではなく、終点がその領域内のどこかにある可能性を示す領域になります。あとは簡単な計算です。
明らかに、ファイバーを作る両方の白い線をチェックしてどちらが長いかを決定するなど、この方法に詳細を入れすぎることができます。または、これらの線が適切にまっすぐではないため、エラーのマージンを許容することもできます...これは概念的なステージなどに厚みが出ます。
プログラミング: C# には優れた機能があり、簡単に使用できます...ここにコードをいくつか載せます...
newBitmap = new Bitmap(openFileDialog1.FileName);
for (int x = 0; x < newBitmap.Width; x++)
{
for (int y = 0; y < newBitmap.Height; y++)
{
Color originalColor = newBitmap.GetPixel(x, y);//gets the pixel value...
//things go here...
}
}
openfiledialog から画像を取得し、画像をビットマップします。ネストされた for ループ内で、このコードは画像を左から右にスキャンしますが、これは変更できます...