2011-11-10 27 views
9

घुमाएं मेरे पास 2 डी numpy arrays के रूप में greyscale छवियों का एक सेट है।घुमावदार 2 डी सरणी

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

मैं निराशा में रहना चाहता हूं, क्योंकि मुझे परिणाम पर संख्यात्मक संचालन करने की आवश्यकता है, लेकिन मैं भी (यदि यह असंभव है) चरण/बाहर जाने की अनुमति दे सकता है; उदाहरण के लिए मैंने पीआईएल का उपयोग करने की कोशिश की, अर्थात् Image.rotate (theta) लेकिन यह समझ में नहीं आता कि मेरे सरणी पर इसे कैसे लागू किया जाए, और सरणी को वापस कैसे प्राप्त किया जाए।

आपके इनपुट के लिए धन्यवाद।

+0

मैंने तुम्हारा 'ग्रे बदल दिया 'छवि प्रसंस्करण' को 'टैग' टैग करें। मुझे लगता है कि यह आपके इरादों को बेहतर तरीके से वर्णित करता है। इसे वापस बदलने के लिए स्वतंत्र महसूस करें – BlackBear

+0

आप सीधे इसे निष्क्रिय में कर सकते हैं, लेकिन आगे और पीछे परिवर्तित करने के लिए, http://effbot.org/zone/pil-numpy.htm देखें। –

+0

सलाह के लिए धन्यवाद, मैंने अभी इस बॉक्स को देखा है! – astabada

उत्तर

3

18:34 पर cgohlke नवंबर 10 '11 की टिप्पणी देखें:

scipy.ndimage.interpolation .shift() पर विचार करें और बारी बारी से() अंतर्वेशित अनुवाद और 2 डी NumPy सरणी के रोटेशन के लिए।

2

बुनियादी संचालन विकिपीडिया transformation matrix पेज में वर्णित हैं - मैं यहाँ ascii मैट्रिक्स कला करने की कोशिश करने नहीं जा रहा हूँ, लेकिन उत्पादन पी '= आर * पी जहां पी' उत्पादन बिंदु है, अनुसंधान 2x2 है रोटेशन कोण के साइन और कोसाइन युक्त रूपांतरण मैट्रिक्स, और पी इनपुट बिंदु है। यदि आप उत्पत्ति के अलावा किसी अन्य चीज़ के बारे में घूमना चाहते हैं, तो मूल को घूर्णन से पहले स्थानांतरित करें: पी '= टी + आर * (पी-टी) जहां टी अनुवाद समन्वय है। मूल मैट्रिक्स ऑपरेशंस इंटरपोलेशन नहीं करते हैं, इसलिए यदि आप एक numpy- आधारित image processing library का उपयोग नहीं कर रहे हैं, तो आप एक रिवर्स ट्रांसफॉर्म करना चाहते हैं: प्रत्येक (पूर्णांक-मूल्यवान) आउटपुट समन्वय के लिए, (फ़्लोटिंग पॉइंट) समन्वय ढूंढें उस बिंदु का जो उसमें घुमाया जाएगा, और आस-पास के पिक्सल से उस इनपुट बिंदु के मान को अलग करेगा।

+0

यह कठिन तरीका होगा ... यदि आपने cgohlke के समाधान की जांच नहीं की है, तो मैंने इसे 120 ± 13 सेकंड में कार्यान्वित किया है। – astabada

0

मैं ऊपर की मदद लेने और एक उदाहरण के द्वारा इस का समाधान चाहते हैं:

import pandas as pd 
 
import numpy as np 
 
bd = np.matrix([[44., -1., 40., 42., 40., 39., 37., 36., -1.], 
 
       [42., -1., 43., 42., 39., 39., 41., 40., 36.], 
 
       [37., 37., 37., 35., 38., 37., 37., 33., 34.], 
 
       [35., 38., -1., 35., 37., 36., 36., 35., -1.], 
 
       [36., 35., 36., 35., 34., 33., 32., 29., 28.], 
 
       [38., 37., 35., -1., 30., -1., 29., 30., 32.]]) 
 
def rotate45(array): 
 
    rot = [] 
 
    for i in range(len(array)): 
 
     rot.append([0] * (len(array)+len(array[0])-1)) 
 
     for j in range(len(array[i])): 
 
      rot[i][int(i + j)] = array[i][j] 
 
    return rot 
 

 
df_bd = pd.DataFrame(data=np.matrix(rotate45(bd.transpose().tolist()))) 
 
df_bd = df_bd.transpose() 
 
print df_bd

जिनमें से उत्पादन किया जाएगा:

44 0 0 0 0 0 0 0 0 
 
42 -1 0 0 0 0 0 0 0 
 
37 -1 40 0 0 0 0 0 0 
 
35 37 43 42 0 0 0 0 0 
 
36 38 37 42 40 0 0 0 0 
 
38 35 -1 35 39 39 0 0 0 
 
0 37 36 35 38 39 37 0 0 
 
0 0 35 35 37 37 41 36 0 
 
0 0 0 -1 34 36 37 40 -1 
 
0 0 0 0 30 33 36 33 36 
 
0 0 0 0 0 -1 32 35 34 
 
0 0 0 0 0 0 29 29 -1 
 
0 0 0 0 0 0 0 30 28 
 
0 0 0 0 0 0 0 0 32

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