2016-11-30 3 views
6

matplotlib में पिक्सेल सीमाओं को रेखांकित कैसे करें? उदाहरण के लिए, नीचे दिए गए एक तरह एक अर्द्ध यादृच्छिक डाटासेट,matplotlib contours मिलान पिक्सेल किनारों कर सकते हैं?

# 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

कैसे बनाने के लिए आकृति पिक्सल से तालमेल? मैं numpy और matplotlib पुस्तकालयों के भीतर एक समाधान की तलाश में हूं।

+0

मैं सोच रहा था कि आप इस विशेष तस्वीर को आकर्षित करने के लिए इन बीजों के साथ कैसे आए? – Andyk

+0

@ एंडिक कुछ भी फैंसी नहीं - वांछित बीज मिलने तक बस यादृच्छिक नमूना दोहराया। –

उत्तर

5

यदि छवि में प्रति इकाई 1 पिक्सेल का संकल्प है, तो आप पिक्सेल के "किनारे" को कैसे परिभाषित करेंगे? "किनारे" की धारणा केवल पिक्सेल की तुलना में बढ़े हुए संकल्प के फ्रेम में समझ में आता है और contour किसी भी किनारों को नहीं खींच सकता है अगर यह छवि के समान संकल्प के साथ काम कर रहा है।

दूसरी ओर, संकल्प को बढ़ाने के लिए निश्चित रूप से संभव है कि धारणा "धार" का अर्थ है। तो मान लीजिए कि हम 100 के कारक द्वारा रिज़ॉल्यूशन बढ़ाते हैं, हम आसानी से contour प्लॉट का उपयोग करके किनारों को खींच सकते हैं।

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() 

enter image description here

तुलना के लिए, हम भी छवि को ही एक ही भूखंड में imshow का उपयोग कर बना सकते हैं।

+0

अच्छा, मैंने विस्तारित ग्रिड पर समोच्च बनाने के बारे में नहीं सोचा था। 'Imshow' और 'contour' के बीच एक विसंगति क्यों है? '100' के बजाय' 10' के संकल्प वृद्धि के लिए इसे बेहतर रूप से देखा जा सकता है। –

+1

पिक्सेल किनारों की परिभाषा पर - मैं कहूंगा कि हमें पिक्सेल किनारों को 'x' और' y' के बराबर '0.5, 1.0, 1.5, ... 'ग्रिड लाइनों को परिभाषित करने से रोकने के लिए कुछ भी नहीं है। तब उन रेखाओं को मूल 'Line2d' के साथ खींचा जा सकता है। –

संबंधित मुद्दे