2016-07-06 13 views
0

私はインデックスを知っているラスタセルで閉じた線を持っています。リストのようなものです -Pythonのラスタライズされた境界線内のラスタファイルのセルインデックスを取得します。

enter image description here

私はこの閉じた線内のセルのインデックスを取得し、別のリストに保存したいと思います。私はPythonでこれをやりたいここではより明確にするための画像である:ラスター境界線これにアプローチする

enter image description here

+0

あなたは(境界内すなわち細胞)ALL内側のポイントを一覧表示することを、特定のか?あなたの最初の写真で与えられた指標から、それはあまりにも大きなセットであるかもしれないかのように見えます。多分、効率的に扱うには大きすぎます。 (後で)必要なのがメンバーシップをテストする方法であれば、それを1つずつテストする方がいいでしょう。 – PeterE

答えて

0

一つの方法は、私の最初のアイデアだった自分自身の(ナイーブ)アルゴリズムを実装することです。もう1つの理由は、なぜホイールを再発明するかです。

問題が白黒(ラスター/ピクセル)画像として解釈されることが容易に分かります。次に、外側と内側の領域は背景(黒)を形成し、境界は閉じた(白)ループです。 (明らかに色も切り替えることができましたが、私は今は黒で白を使用します)。その結果、かなり洗練されたPythonの画像処理ライブラリ、すなわちskimage,ndimageおよびmahotasがあります。

私は専門家はいませんが、私はskimage.draw.polygonskimage.draw.polygon_perimiterがあなたの問題を解決する最も簡単な方法だと思います。

私の実験がもたらした次

import matplotlib.pyplot as plt 
import numpy as np 

from skimage.draw import polygon, polygon_perimeter 
from skimage.measure import label, regionprops 

# some test data 
# I used the format that your input data is in 
# These are 4+99*4 points describing the border of a 99*99 square 
border_points = (
    [[100,100]] + 
    [[100,100+i] for i in range(1,100)] + 
    [[100,200]] + 
    [[100+i,200] for i in range(1,100)] + 
    [[200,200]] + 
    [[200,200-i] for i in range(1,100)] + 
    [[200,100]] + 
    [[200-i,100] for i in range(1,100)] 
    ) 

# convert to numpy arrays which hold the x/y coords for all points 
# repeat first point at the end to close polygon. 
border_points_x = np.array([p[0] for p in border_points] + [border_points[0][0]]) 
border_points_y = np.array([p[1] for p in border_points] + [border_points[0][1]]) 

# empty (=black) 300x300 black-and-white image 
image = np.zeros((300, 300)) 

# polygon() calculates the indices of a filled polygon 
# one would expect this to be inner+border but apparently it is inner+border/2 
# probably some kind of "include only the left/top half" 
filled_rr, filled_cc = polygon(border_points_y, border_points_x) 
# set the image to white at these points 
image[filled_rr, filled_cc] = 1 

# polygon_perimeter() calculates the indices of a polygon perimiter (i.e. border) 
border_rr, border_cc = polygon_perimeter(border_points_y, border_points_x) 
# exclude border, by setting it to black 
image[border_rr, border_cc] = 0 

# label() detects connected patches of the same color and enumerates them 
# the resulting image has each of those regions filled with its index 
label_img, num_regions = label(image, background=0, return_num=True) 

# regionprops() takes a labeled image and computes some measures for each region 
regions = regionprops(label_img) 
inner_region = regions[0] 

print("area", inner_region.area) 
# expecting 9801 = 99*99 for inner 

# this is what you want, the coords of all inner points 
inner_region.coords 

# print it 
fig, ax = plt.subplots() 
ax.imshow(image, cmap=plt.cm.gray) 
関連する問題