2016-09-22 15 views
1

私は輪郭が見つかった画像をskimage.measure.find_contours()としましたが、今度は最大の閉じた輪郭の外にあるピクセルのマスクを作成したいと思います。どのようにこれを行うにはどのようなアイデア?マニュアルに例を変更スキマージの輪郭からマスクを作成する

:ここ

import numpy as np 
import matplotlib.pyplot as plt 
from skimage import measure 

# Construct some test data 
x, y = np.ogrid[-np.pi:np.pi:100j, -np.pi:np.pi:100j] 
r = np.sin(np.exp((np.sin(x)**2 + np.cos(y)**2))) 

# Find contours at a constant value of 0.8 
contours = measure.find_contours(r, 0.8) 

# Select the largest contiguous contour 
contour = sorted(contours, key=lambda x: len(x))[-1] 

# Display the image and plot the contour 
fig, ax = plt.subplots() 
ax.imshow(r, interpolation='nearest', cmap=plt.cm.gray) 
X, Y = ax.get_xlim(), ax.get_ylim() 
ax.step(contour.T[1], contour.T[0], linewidth=2, c='r') 
ax.set_xlim(X), ax.set_ylim(Y) 
plt.show() 

赤文字の輪郭です:

enter image description here

しかし、あなたがズームインするとき、輪郭はの解像度ではなく、気づきますピクセル。

enter image description here

はどのようにマスク(即ち輪郭線が交差しない)完全に外側のピクセルを有するオリジナルと同じ大きさの画像を作成することができますか?例えば。

from numpy import ma 
masked_image = ma.array(r.copy(), mask=False) 
masked_image.mask[pixels_outside_contour] = True 

ありがとうございます!

答えて

1

[OK]を、私はパスに輪郭を変換して内部のピクセルを選択することによって、この作業を行うことができた:

# Convert the contour into a closed path 
from matplotlib import path 
closed_path = path.Path(contour.T) 

# Get the points that lie within the closed path 
idx = np.array([[(i,j) for i in range(r.shape[0])] for j in range(r.shape[1])]).reshape(np.prod(r.shape),2) 
mask = closed_path.contains_points(idx).reshape(r.shape) 

# Invert the mask and apply to the image 
mask = np.invert(mask) 
masked_data = ma.array(r.copy(), mask=mask) 

しかし、この種の封じ込めのための遅い試験N = r.shape[0]*r.shape[1]画素です。誰もがより高速なアルゴリズムを持っていますか?ありがとう!