2017-07-12 9 views
3

私は、分割されたイメージの領域上の特定のパラメータを評価したいプロジェクトに取り組んでいます。だから私は、次のコードopencvでどのように分割された領域のリストを取得するのですか

col = cv2.imread("in.jpg",1) 
    col=cv2.resize(col,(width,height),interpolation=cv2.INTER_CUBIC) 
    res=cv2.pyrMeanShiftFiltering(col,20,45,3) 

を持っており、今何とか解像度で地域ごとにマスクのリストを取得したいと思います。解像度は、今、この

1 1 0 2 1 
1 0 0 2 1 
0 0 2 2 1 

のようなものだった場合 だから例えば私は、このような

1 1 0 0 0 
1 0 0 0 0 
0 0 0 0 0 
, 
0 0 1 0 0 
0 1 1 0 0 
1 1 0 0 0 
, 
0 0 0 1 0 
0 0 0 1 0 
0 0 1 1 0 
, 
0 0 0 0 1 
0 0 0 0 1 
0 0 0 0 1 

として出力を取得したいと思いだからそれは接続されている同じ値の各グループのためのマスクです。たぶんこれはfloodfill関数に関係するかもしれませんか?私は それは多分すべてのピクセルをループして、洪水充填し、そのピクセルのセットが既に設定されているかどうかを確認するために比較することがありますが、それは非常に高価な方法のように思えるかもしれないので、ここ ああとは、コードが実行された後にRESの一例イメージです here

答えて

1

ここでの一つの手法だcv2.connectedComponents -

def list_seg_regs(a): # a is array 
    out = [] 
    for i in np.unique(a): 
     ret, l = cv2.connectedComponents((a==i).astype(np.uint8)) 
     for j in range(1,ret): 
      out.append((l==j).astype(int)) #skip .astype(int) for bool 
    return out 

サンプル実行 - 、OpenCV2は」doesnの

In [53]: a = np.array([ 
    ...: [1, 1, 0, 2, 1], 
    ...: [1, 0, 0, 2, 1], 
    ...: [0, 0, 2, 2, 1]]) 

In [54]: out = list_seg_regs(a) 

In [55]: out[0] 
Out[55]: 
array([[0, 0, 1, 0, 0], 
     [0, 1, 1, 0, 0], 
     [1, 1, 0, 0, 0]]) 

In [56]: out[1] 
Out[56]: 
array([[1, 1, 0, 0, 0], 
     [1, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0]]) 

In [57]: out[2] 
Out[57]: 
array([[0, 0, 0, 0, 1], 
     [0, 0, 0, 0, 1], 
     [0, 0, 0, 0, 1]]) 

In [58]: out[3] 
Out[58]: 
array([[0, 0, 0, 1, 0], 
     [0, 0, 0, 1, 0], 
     [0, 0, 1, 1, 0]]) 
+0

@Thijserので、 'cv2.connectedComponents'を持っていますか? – Divakar

+0

'Scipy'には対応があるようです - https://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.ndimage.measurements.label.html – Divakar

+0

@Thijserよく質問に' a 'を2D配列として使用していますが、3D画像のようにRGB画像を扱っていると思いますか?調べるには、 'image.ndim'を実行します。ここで、' image'はあなたの入力イメージです。 – Divakar

関連する問題