2009-03-29 16 views
7

यह भी देखें: Why is my image rotation algorithm not working?मैं एक छवि को कैसे घुमा सकता हूं?

यह सवाल विशिष्ट भाषा नहीं है, और एक गणित समस्या है। हालांकि मैं कुछ सी ++ कोड का उपयोग करके यह बताने के लिए उपयोग करूंगा कि मुझे गणित पर बहुत गर्म नहीं है।

यहां बताया गया है छवि बना है:

ImageMatrix image; 
image[0][0][0] = 1; 
image[0][1][0] = 2; 
image[0][2][0] = 1; 
image[1][0][0] = 0; 
image[1][1][0] = 0; 
image[1][2][0] = 0; 
image[2][0][0] = -1; 
image[2][1][0] = -2; 
image[2][2][0] = -1; 

यहाँ समारोह मैं बनाने के लिए कोशिश कर रहा हूँ के लिए प्रोटोटाइप है:

ImageMatrix rotateImage(ImageMatrix image, double angle); 

मैं केवल पहले दो सूचकांकों बारी बारी से करना चाहते हैं (पंक्तियों और स्तंभ) लेकिन चैनल नहीं।

+0

कितना द्वारा घुमाने? एक मनमाना कोण या 90 डिग्री के एकाधिक? – shoosh

+0

@Shoosh: प्रोटोटाइप सुझाव देता है (डबल कोण) यह किसी भी प्रकार के किसी भी प्रकार का उपयोग करना चाहिए। –

उत्तर

26

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

output = new Image(input.size()) 

for each pixel in input: 
{ 
    p2 = rotate(pixel, -angle); 
    value = interpolate(input, p2) 
    output(pixel) = value 
} 

वहाँ प्रक्षेप करने के लिए विभिन्न तरीके हैं। रोटेशन के सूत्र मुझे लगता है कि आप के लिए https://en.wikipedia.org/wiki/Rotation_matrix#In_two_dimensions

जांच होनी चाहिए लेकिन अभी यहाँ अच्छा हो सकता है, यह है (बिंदु (एक्स, वाई) कोण डिग्री/रेडियंस का घूर्णन):

newX = cos(angle)*x - sin(angle)*y 
newY = sin(angle)*x + cos(angle)*y 
+0

धन्यवाद किगुराई। मैंने इसे लागू करने की कोशिश की लेकिन मुझे बहुत भाग्य नहीं मिला, शायद आप एक नज़र डाल सकें? http://stackoverflow.com/questions/697520/why-is-my-image-rotation-algorithm-not-working –

2

नोट करें रोटेशन मैट्रिस के अलावा एक और समाधान है, जो एलियासिंग के माध्यम से छवि की जानकारी को ढीला नहीं करता है। आप 2 डी छवि रोटेशन को skews and scalings में अलग कर सकते हैं, जो छवि की गुणवत्ता को संरक्षित करता है।

Here's a simpler explanation

+0

दिलचस्प है, लेकिन मुझे "Nyquist आवृत्ति" या "स्पेक्ट्रम" जैसे गणित के अधिकांश शब्दों को समझ में नहीं आता है छवि "। क्या आप मुझे पृष्ठभूमि की जानकारी के लिए पढ़ने के लिए सामग्री पर इंगित कर सकते हैं? क्या यह कुछ है जो मैं स्वयं खोज सकता हूं या क्या मुझे वास्तविक गणित शिक्षा की आवश्यकता होगी? (मैं पिछले साल गणित हाई स्कूल के छात्र हूं।) –

+0

@ इरंबिलानजा: सिग्नल प्रोसेसिंग सिद्धांत दूसरा या तीसरा साल ईई सामान है। इंटीग्रल कैलकुस को कैसे करना है यह जानना पहले मदद करता है। –

+0

हमेशा विकिपीडिया है: http://en.wikipedia.org/wiki/Nyquist_frequency एक छवि के स्पेक्ट्रोग्राम के रूप में आवृत्ति के बारे में सोचें: यह केवल ऑडियो प्लेयर के ग्राफिकल विश्लेषक के आउटपुट के बराबर है, केवल 2 डी में। यह दिखाता है कि छवि में कौन सी आवृत्ति दिखाई दे रही है, और किस दिशा में। – heeen

0

यह उदाहरण आपके द्वारा दिए गए की तरह लगता है कुछ बढ़त का पता लगाने गिरी है। तो यदि आप अलग-अलग कोणों के किनारों का पता लगाना चाहते हैं तो आप कुछ निरंतर फ़ंक्शन चुन सकते हैं (जो आपके मामले में एक्स 2 द्वारा गुणा x1 का पैरामीरिज्ड गाऊशियन हो सकता है) और फिर इसे किगुराई द्वारा प्रदत्त सूत्रों के अनुसार घुमाएं। नतीजतन आप एक diskrete कर्नेल अधिक कुशलता से और अलियासिंग के बिना उत्पादन करने में सक्षम हो जाएगा।

2

एक छवि घुमाने के लिए, आप 3 अंक बनाने के लिए:

A----B 
| 
| 
C 

और बारी बारी से कि ए के आसपास नई घुमाया छवि आप यह कर पाने के लिए:

  • 2 डी में एक के आसपास एबीसी घुमाने के लिए, तो यह एक एकल यूलर रोटेशन
  • ए से बी तक घूर्णन स्थिति में घूमता है। प्रत्येक पिक्सेल के लिए आप मूल छवि में क्षैतिज रेखा से बाएं से दाएं भी पार करते हैं। तो यदि छवि चौड़ाई 100, ऊंचाई 50 की एक छवि है, तो आप 100 चरणों में ए से बी तक और 50 से 50 चरणों में ए से सी तक पहुंच जाएंगे, एबीसी द्वारा घूर्णन वाले क्षेत्र में 100 पिक्सेल की 50 लाइनें खींचेगी ।

यह जटिल लग सकता है लेकिन ऐसा नहीं है। rotoZoomer by me

जब ड्राइंग, मैं स्रोत संकेत थोड़ा बदल एक रबर की तरह प्रभाव प्राप्त करने के लिए, लेकिन अगर आप को अक्षम है, तो आप कोड छवि घूमता दिखाई देंगे: कृपया इस सी # कोड मैं कुछ समय पहले लिखा देखना बिना किसी समस्या के। बेशक, कुछ कोणों पर आपको एक ऐसी छवि मिल जाएगी जो थोड़ा विकृत दिखती है। स्रोतकोड में टिप्पणियां हैं कि क्या हो रहा है ताकि आप आसानी से इसके पीछे गणित/तर्क को पकड़ सकें।

जावा की तरह आप तो बेहतर है, मैं भी एक जावा संस्करण एक बार, 14 या तो साल पहले बना दिया है;) -> http://www.xs4all.nl/~perseus/zoom/zoom.java

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