2016-11-30 2 views
6

matplotlibのピクセル境界を概説する方法は?例えば、以下のような半ランダムデータセット、matplotlibの輪郭がピクセルのエッジに一致することはできますか?

# the code block that follows is irrelevant 
import numpy as np 
k = [] 
for s in [2103, 1936, 2247, 2987]: 
    np.random.seed(s) 
    k.append(np.random.randint(0, 2, size=(2,6))) 
arr = np.hstack([np.vstack(k)[:, :-1], np.vstack(k).T[::-1].T ]) 
image = np.zeros(shape=(arr.shape[0]+2, arr.shape[1]+2)) 
image[1:-1, 1:-1] = arr 

ことがimageの画素のエッジを一致輪郭輪郭機能のデフォルトの動作に好ましいであろうことは明らかです等高線は効果的にエッジピクセルの対角線にわたって描画されます。輪郭がピクセルに合わせにする方法

import matplotlib.pyplot as plt 
plt.contour(image[::-1], [0.5], colors='r') 

binary_invader

?私はnumpymatplotlibライブラリ内の解決策を探しています。

+0

私はこの種の絵を描くためにどのようにこれらの種を思いついたのでしょうか? – Andyk

+0

@Andyk nothing fancy - 希望の種子が見つかるまでランダムサンプリングを繰り返しただけです。 –

答えて

5

画像の解像度が1ピクセルあたり1ピクセルの場合、ピクセルの「エッジ」はどのように定義しますか? 「エッジ」という概念は、ピクセル自体に比べて解像度が向上したフレームでのみ意味を持ち、contourは画像自体と同じ解決法で動作している場合はエッジを描画できません。

一方、「エッジ」という概念が意味を持つように解像度を上げることはもちろん可能です。ですから、解像度を100倍に増やして、contourプロットを使ってエッジを簡単に描画できるとしましょう。比較のために

enter image description here

import matplotlib.pyplot as plt 
import numpy as np 

k = [] 
for s in [2103, 1936, 2247, 2987]: 
    np.random.seed(s) 
    k.append(np.random.randint(0, 2, size=(2,6))) 
arr = np.hstack([np.vstack(k)[:, :-1], np.vstack(k).T[::-1].T ]) 
image = np.zeros(shape=(arr.shape[0]+2, arr.shape[1]+2)) 
image[1:-1, 1:-1] = arr 


f = lambda x,y: image[int(y),int(x) ] 
g = np.vectorize(f) 

x = np.linspace(0,image.shape[1], image.shape[1]*100) 
y = np.linspace(0,image.shape[0], image.shape[0]*100) 
X, Y= np.meshgrid(x[:-1],y[:-1]) 
Z = g(X[:-1],Y[:-1]) 

plt.imshow(image[::-1], origin="lower", interpolation="none", cmap="Blues") 

plt.contour(Z[::-1], [0.5], colors='r', linewidths=[3], 
      extent=[0-0.5, x[:-1].max()-0.5,0-0.5, y[:-1].max()-0.5]) 

plt.show() 

、我々はまた、 imshowを使用して、同じプロットで画像自体を描くことができます。

+0

ニース、私は拡張グリッド上で輪郭を作ることを考えていませんでした。どうして 'imshow'と' contour 'の間に不一致がありますか? '100'の代わりに' 10'の解像度を上げるために、より視覚的に見ることができます。 –

+1

ピクセルエッジの定義では、 '0.5 '、1.0、1.5、...'グリッドラインに等しい 'x'と' y'のピクセルエッジを定義するのを止めるものは何もないと言います。これらの行は、基本的な 'Line2d'で描画することができます。 –

関連する問題