मेरे पास OSRM-Project में बिलिनियर इंटरपोलेशन के बारे में एक प्रश्न है। मैं "सामान्य" बिलिनियर इंटरपोलेशन को समझता हूं। यहाँ विकिपीडिया से चित्र, क्या पागलपन है:

Bilinear Interpolation - Wikipedia

अब मैं बिलिनियर इंटरपोलेशन को समझने की कोशिश कर रहा हूं जिसका उपयोग ओएसआरएम-प्रोजेक्ट में रैस्टर सोर्स डेटा के लिए किया जाता है।

// Query raster source using bilinear interpolation
RasterDatum RasterSource::GetRasterInterpolate(const int lon, const int lat) const
{
if (lon < xmin || lon > xmax || lat < ymin || lat > ymax)
{
    return {};
}

const auto xthP = (lon - xmin) / xstep;
const auto ythP =
    (ymax - lat) /
    ystep; // the raster texture uses a different coordinate system with y pointing downwards

const std::size_t top = static_cast<std::size_t>(fmax(floor(ythP), 0));
const std::size_t bottom = static_cast<std::size_t>(fmin(ceil(ythP), height - 1));
const std::size_t left = static_cast<std::size_t>(fmax(floor(xthP), 0));
const std::size_t right = static_cast<std::size_t>(fmin(ceil(xthP), width - 1));

// Calculate distances from corners for bilinear interpolation
const float fromLeft = xthP - left; // this is the fraction part of xthP
const float fromTop = ythP - top;   // this is the fraction part of ythP
const float fromRight = 1 - fromLeft;
const float fromBottom = 1 - fromTop;

return {static_cast<std::int32_t>(raster_data(left, top) * (fromRight * fromBottom) +
                                  raster_data(right, top) * (fromLeft * fromBottom) +
                                  raster_data(left, bottom) * (fromRight * fromTop) +
                                  raster_data(right, bottom) * (fromLeft * fromTop))};
}

मूल कोड यहाँ

क्या कोई मुझे समझा सकता है कि कोड कैसे काम करता है?

इनपुट प्रारूप ASCII प्रारूप में SRTM डेटा है।

चर ऊंचाई और चौड़ाई को nrows और ncolumns के रूप में परिभाषित किया गया है। चर xstep और ystep को इस प्रकार परिभाषित किया गया है:

return (max - min) / (static_cast<float>(count) - 1)

जहां गिनती yकदम के लिए ऊंचाई है और xstep के लिए चौड़ाई है, अधिकतम और मिनट समान।

और एक और सवाल: क्या मैं TIF-format और पूरी दुनिया में डेटा के लिए समान कोड का उपयोग कर सकता हूं?

0
Daniel Christoph 19 जुलाई 2017, 14:18
यदि आप कहते हैं, आप पहले से ही बिलिनियर इंटरपोलेशन को समझते हैं, तो निश्चित रूप से आपको पहले से ही इस कोड को समझना चाहिए?
 – 
meowgoesthedog
19 जुलाई 2017, 14:59
ठीक है, शायद मुझे स्पष्ट होना चाहिए: मैं बिलिनियर इंटरपोलेशन के पीछे के सिद्धांत को समझता हूं। मैं इस कोड के मूल तर्क को समझता हूं, लेकिन मुझे समझ में नहीं आता कि क्यों उदा। चर "नीचे" की गणना इस कारण की जाती है, विशेष रूप से "ऊंचाई - 1"। और "फ्रॉमएक्स" चर की गणना कैसे काम करती है।
 – 
Daniel Christoph
19 जुलाई 2017, 15:06

1 उत्तर

सबसे बढ़िया उत्तर

क्षैतिज पिक्सेल निर्देशांक [0, width - 1] की सीमा में हैं; इसी तरह लंबवत निर्देशांक [0, height - 1] में हैं। (सी ++ सहित कई भाषाओं में उपयोग किए जाने वाले ज़ीरो-इंडेक्सिंग कन्वेंशन)

रेखाएं

const auto xthP = (lon - xmin) / xstep; (और ythP के लिए)

इनपुट छवि-स्थान निर्देशांक (long, lat) को पिक्सेल निर्देशांक में कनवर्ट करें। xstep छवि-स्थान में प्रत्येक पिक्सेल की चौड़ाई है।

इसे नीचे गोल करना (floor का उपयोग करके) एक तरफ नमूना क्षेत्र द्वारा प्रतिच्छेदित पिक्सेल देता है, और गोल करना (ceil) दूसरी तरफ पिक्सेल देता है। X-निर्देशांक के लिए ये left और right देते हैं।

fmin और fmax का उपयोग करने का कारण निर्देशांकों को क्लैंप करना है ताकि वे पिक्सेल निर्देशांक सीमा से अधिक न हों।


संपादित करें: चूंकि आप इस चित्र की व्याख्या करने की कोशिश कर रहे हैं, मैं नीचे संबंधित भागों की सूची दूंगा:

  • Q11 = (left, top)
  • Q12 - (left, bottom), आदि।
  • P = (xthP, ythP)
  • R1 = fromTop, R2 = fromBottom आदि।

एक अच्छा प्रारंभ बिंदु होगा http:// www.cs.uu.nl/docs/vakken/gr/2011/Slides/06-texturing.pdf, स्लाइड 27. भविष्य में हालांकि, Google आपका मित्र है।

2
meowgoesthedog 19 जुलाई 2017, 15:41
ठीक! लेकिन "fromRight = 1 - fromLeft;" के साथ क्या है और "नीचे से = 1 - ऊपर से;"? "1 - एक्स" क्यों?
 – 
Daniel Christoph
19 जुलाई 2017, 15:18
तो आप स्पष्ट रूप से कार्यान्वयन के संदर्भ में बिलिनियर इंटरपोलेशन को नहीं समझ पाए हैं। ये नमूना बॉक्स के दोनों ओर पिक्सेल के साथ आंशिक चौराहे की गणना करते हैं, और फिर प्रत्येक पिक्सेल द्वारा ओवरलैप किए गए नमूना बॉक्स के भिन्नात्मक क्षेत्रों की गणना करने के लिए एक साथ उपयोग किया जाता है। इन क्षेत्रों को तब प्रक्षेप के लिए भार के रूप में उपयोग किया जाता है; तो अनिवार्य रूप से आप केवल कोड की अंतिम पंक्ति को समझते हैं।
 – 
meowgoesthedog
19 जुलाई 2017, 15:20
बीटीडब्ल्यू विकिपीडिया से वह तस्वीर वास्तव में आपकी स्थिति में मदद नहीं करती है, क्योंकि लेबलिंग बहुत अलग है। मैं आपको इस कोड के संदर्भ में इसे अनदेखा करने की सलाह देता हूं।
 – 
meowgoesthedog
19 जुलाई 2017, 15:27
ठीक है, शायद यह मेरी समस्या है। मैं OSRM से इस चित्र में कोड का "अनुवाद" करने का प्रयास कर रहा हूं।
 – 
Daniel Christoph
19 जुलाई 2017, 15:31
क्या आपके पास एक अच्छा संसाधन है, जहां मैं कार्यान्वयन के संदर्भ में बिलिनियर इंटरपोलेशन सीख सकता हूं?
 – 
Daniel Christoph
19 जुलाई 2017, 15:36