2013-01-04 25 views
6

मैं इस तरह छवियों का एक समूह है। मुझे नीले वक्र पर लगभग 100 अंक (नियमित रूप से एक्स-स्पेस) स्वचालित रूप से पुनर्प्राप्त करने की आवश्यकता है। सभी घटता बहुत समान हैं, इसलिए मुझे कम से कम 1 पिक्सेल परिशुद्धता की आवश्यकता है, लेकिन उप-पिक्सेल को प्राथमिकता दी जाएगी। अच्छी खबर यह है कि सभी वक्र 0,0 से शुरू होते हैं और 1,1 पर समाप्त होते हैं, इसलिए हम ग्रिड के बारे में भूल सकते हैं।छवि विश्लेषण वक्र ढाले

अजगर libs पर कोई संकेत मदद कर सकता है या किसी अन्य दृष्टिकोण? धन्यवाद !

+0

दिलचस्प सवाल, मैं समाधान पर काम कर रहा हूं, लेकिन उप-पिक्सेल परिशुद्धता असंभव है। –

+1

केवल अर्द्ध स्वचालित लेकिन अभी भी प्रश्न के लिए प्रासंगिक है, यह वेब ऐप चमत्कार कर सकता है: http://arohatgi.info/WebPlotDigitizer/ –

उत्तर

6

मैंने आपकी छवि को 14154233_input.png फ़ाइल में सहेजा है। तो फिर इस कार्यक्रम

import pylab as plt 
import numpy as np 

# Read image from disk and filter all grayscale 
im = plt.imread("14154233_input.png")[:,:,:3] 
im -= im.mean(axis=2).reshape(im.shape[0], im.shape[1], 1).repeat(3,axis=2) 
im_maxnorm = im.max(axis=2) 

# Find y-position of remaining line 
ypos = np.ones((im.shape[1])) * np.nan 
for i in range(im_maxnorm.shape[1]): 
    if im_maxnorm[:,i].max()<0.01: 
     continue 
    ypos[i] = np.argmax(im_maxnorm[:,i]) 

# Pick only values that are set 
ys = 1-ypos[np.isfinite(ypos)] 
# Normalize to 0,1 
ys -= ys.min() 
ys /= ys.max() 

# Create x values 
xs = np.linspace(0,1,ys.shape[0]) 

# Create plot of both 
# read and filtered image and 
# data extracted 
plt.figure(figsize=(4,8)) 
plt.subplot(211) 
plt.imshow(im_maxnorm) 
plt.subplot(212, aspect="equal") 
plt.plot(xs,ys) 
plt.show() 

इस साजिश का उत्पादन:

Ausgabe

फिर आप xs और ys जो चाहो साथ कर सकते हैं। शायद आपको यह कोड उस फ़ंक्शन में रखना चाहिए जो xs और ys या तो देता है।

कोई भी प्रत्येक कॉलम पर गॉसियन फिट करके सटीकता में सुधार कर सकता है। अगर आपको वास्तव में इसकी ज़रूरत है, तो मुझे बताओ।

+0

मैं पिलैब के साथ व्यावहारिक नहीं हूं, क्या मैं आपको यह बताने के लिए कह सकता हूं कि 'im - = im.mean (अक्ष = 2) .reshape (im.shape [0], im.shape [1], 1)। दोहराएं (3, अक्ष = 2) 'रेखा काम करता है? –

+0

निश्चित रूप से। imread हमें एक आरजीबीए छवि देता है, यानी, हमारे सरणी में आकार (एक्स, वाई, 4) है, जिसे मैं अल्फा ([:,:,: 3] पिछली पंक्ति में छोड़कर तुरंत कम करता हूं)। मैं फिर लाल रंग/हरा = नीला (सभी काले रंग से सफेद तक) के साथ सभी रंगों को सेट करना चाहता था, ताकि केवल नीली रेखा बनी रहे। मैं प्रत्येक पिक्सेल के लिए, उनमें से प्रत्येक से आर, जी और बी-मानों का औसत घटाकर ऐसा करता हूं। यदि वे बराबर हैं, तो सभी शून्य हो जाते हैं। '.mean (अक्ष = 2) 'औसत की गणना करता है, 2 डी-सरणी बनाता है; '.reshape() 'इसे 3 डी फिर से बनाता है, केवल 3. जोड़कर लेन 1; '.repeat()' सरणी के आकार को 'im' के रीसेट करता है –

2

सबसे पहले, के माध्यम से

from scipy.misc import imread  
im = imread("thefile.png") 

यह तीसरा आयाम रंग चैनल (RGB + अल्फ़ा) होने के साथ एक 3 डी numpy सरणी देता छवि पढ़ें। वक्र नीले चैनल में है, लेकिन ग्रिड भी है। लेकिन लाल चैनल में, आपके पास ग्रिड है और वक्र नहीं है। तो हम

a = im[:,:,2] - im[:,:,0] 

अब, हम प्रत्येक कॉलम के साथ अधिकतम की स्थिति चाहते हैं। एक पिक्सेल परिशुद्धता के साथ, यह द्वारा

y0 = np.argmax(a, axis=0) 

दिया जाता है इसी का परिणाम शून्य है जब वहाँ स्तंभ है, यानी फ्रेम के बाहर में कोई नीले वक्र है।

xmin, xmax = np.where(y0>0)[0][[0,-1] 

द्वारा फ्रेम की सीमाएं प्राप्त कर सकते हैं, इसके साथ आप एक्स अक्ष को पुन: सहेजने में सक्षम हो सकते हैं।

फिर, आप सबपिक्सेल रिज़ॉल्यूशन चाहते हैं। हमें एक एकल स्तंभ

f=a[:,x] 

पर ध्यान केंद्रित हम न्यूटन विधि की एक एकल पुनरावृत्ति का उपयोग एक एक्सट्रीमा की स्थिति

y1 = y0 - f'[y]/f''[y] 

ध्यान दें कि हम विचारशील नमूने की वजह से आगे पुनरावृति नहीं कर सकते परिष्कृत करने के लिए करते हैं। फिर भी, हम डेरिवेटिव्स का अच्छा अनुमान चाहते हैं, इसलिए हम दोनों के लिए 5-पॉइंट योजना का उपयोग करेंगे।

coefprime = np.array([1,-8, 0, 8, -1], float) 
coefsec = np.array([-1, 16, -30, 16, -1], float) 
y1 = y0 - np.dot(f[y0-2:y0+3], coefprime)/np.dot(f[y0-2:y0+3], coefsec) 

पीएस : Thorsten Kranz मुझसे अधिक तेज़ था (कम से कम यहां), लेकिन मेरे जवाब में उप-पिक्सेल परिशुद्धता है और नीली वक्र निकालने का मेरा तरीका शायद अधिक समझ में आता है।