私の目標は、多くの個別の形状を含む図面をトレースし、これらの形状を個々の画像に分割することです. 白地に黒です。私は numpy、opencv&co にはまったく慣れていませんが、現在の考えは次のとおりです。
- 黒いピクセルをスキャンする
- 黒いピクセルが見つかりました -> 分水界
- 分水界の境界を見つける (ポリゴン パスとして)
- 検索を続行しますが、既に見つかった境界内の点は無視します
こういうのが苦手なのですが、何か良い方法はありませんか?
最初に、流域の結果の長方形の境界ボックスを見つけようとしました (これは多かれ少なかれ例のコラージュです)。
from numpy import *
import numpy as np
from scipy import ndimage
np.set_printoptions(threshold=np.nan)
a = np.zeros((512, 512)).astype(np.uint8) #unsigned integer type needed by watershed
y, x = np.ogrid[0:512, 0:512]
m1 = ((y-200)**2 + (x-100)**2 < 30**2)
m2 = ((y-350)**2 + (x-400)**2 < 20**2)
m3 = ((y-260)**2 + (x-200)**2 < 20**2)
a[m1+m2+m3]=1
markers = np.zeros_like(a).astype(int16)
markers[0, 0] = 1
markers[200, 100] = 2
markers[350, 400] = 3
markers[260, 200] = 4
res = ndimage.watershed_ift(a.astype(uint8), markers)
unique(res)
B = argwhere(res.astype(uint8))
(ystart, xstart), (ystop, xstop) = B.min(0), B.max(0) + 1
tr = a[ystart:ystop, xstart:xstop]
print tr
どういうわけか、元の配列 (a) を使用すると、argwhere は機能しているように見えますが、流域 (res) の後、完全な配列が再び出力されるだけです。
次のステップは、シェイプの周りのポリゴン パスを見つけることかもしれませんが、今のところバウンディング ボックスで十分です。
助けてください!