কি কিউবিক ল্যাংরেঞ্জ ইন্টারপোলেশন টেনসর পণ্যটি কী বাইকুবিক ইন্টারপোলেশন হিসাবে একই?


11

আমি yx অক্ষ জুড়ে ল্যাঞ্জ্রেজ ইন্টারপোলেশন ব্যবহারের জন্য চারটি মান পেতে x অক্ষের বাইরে ল্যাঞ্জ্রেজ ইন্টারপোলেশন করে সবেমাত্র 4x4 নিকটতম পিক্সেল স্যাম্পলিং করে কিছু ইন্টারপোল্টেড টেক্সচার নমুনা প্রয়োগ করেছি implemented

এটি কী বাইকুবিক ইন্টারপোলেশন এর সমান বা এটি আলাদা? বা সেখানে বিভিন্ন ধরণের বিকিউবিক ইন্টারপোলেশন রয়েছে, এবং এটি সম্ভবত তাদের মধ্যে একটি?

এখানে Webgl Shadertoy বাস্তবায়ন এবং নীচে প্রাসঙ্গিক GLSL (WebGL) কোড: https://www.shadertoy.com/view/MllSzX

ধন্যবাদ!

float c_textureSize = 64.0;

float c_onePixel = 1.0 / c_textureSize;
float c_twoPixels = 2.0 / c_textureSize;

float c_x0 = -1.0;
float c_x1 =  0.0;
float c_x2 =  1.0;
float c_x3 =  2.0;

//=======================================================================================
vec3 CubicLagrange (vec3 A, vec3 B, vec3 C, vec3 D, float t)
{
    return
        A * 
        (
            (t - c_x1) / (c_x0 - c_x1) * 
            (t - c_x2) / (c_x0 - c_x2) *
            (t - c_x3) / (c_x0 - c_x3)
        ) +
        B * 
        (
            (t - c_x0) / (c_x1 - c_x0) * 
            (t - c_x2) / (c_x1 - c_x2) *
            (t - c_x3) / (c_x1 - c_x3)
        ) +
        C * 
        (
            (t - c_x0) / (c_x2 - c_x0) * 
            (t - c_x1) / (c_x2 - c_x1) *
            (t - c_x3) / (c_x2 - c_x3)
        ) +       
        D * 
        (
            (t - c_x0) / (c_x3 - c_x0) * 
            (t - c_x1) / (c_x3 - c_x1) *
            (t - c_x2) / (c_x3 - c_x2)
        );
}

//=======================================================================================
vec3 BicubicTextureSample (vec2 P)
{
    vec2 pixel = P * c_textureSize + 0.5;

    vec2 frac = fract(pixel);
    pixel = floor(pixel) / c_textureSize - vec2(c_onePixel/2.0);

    vec3 C00 = texture2D(iChannel0, pixel + vec2(-c_onePixel ,-c_onePixel)).rgb;
    vec3 C10 = texture2D(iChannel0, pixel + vec2( 0.0        ,-c_onePixel)).rgb;
    vec3 C20 = texture2D(iChannel0, pixel + vec2( c_onePixel ,-c_onePixel)).rgb;
    vec3 C30 = texture2D(iChannel0, pixel + vec2( c_twoPixels,-c_onePixel)).rgb;

    vec3 C01 = texture2D(iChannel0, pixel + vec2(-c_onePixel , 0.0)).rgb;
    vec3 C11 = texture2D(iChannel0, pixel + vec2( 0.0        , 0.0)).rgb;
    vec3 C21 = texture2D(iChannel0, pixel + vec2( c_onePixel , 0.0)).rgb;
    vec3 C31 = texture2D(iChannel0, pixel + vec2( c_twoPixels, 0.0)).rgb;    

    vec3 C02 = texture2D(iChannel0, pixel + vec2(-c_onePixel , c_onePixel)).rgb;
    vec3 C12 = texture2D(iChannel0, pixel + vec2( 0.0        , c_onePixel)).rgb;
    vec3 C22 = texture2D(iChannel0, pixel + vec2( c_onePixel , c_onePixel)).rgb;
    vec3 C32 = texture2D(iChannel0, pixel + vec2( c_twoPixels, c_onePixel)).rgb;    

    vec3 C03 = texture2D(iChannel0, pixel + vec2(-c_onePixel , c_twoPixels)).rgb;
    vec3 C13 = texture2D(iChannel0, pixel + vec2( 0.0        , c_twoPixels)).rgb;
    vec3 C23 = texture2D(iChannel0, pixel + vec2( c_onePixel , c_twoPixels)).rgb;
    vec3 C33 = texture2D(iChannel0, pixel + vec2( c_twoPixels, c_twoPixels)).rgb;    

    vec3 CP0X = CubicLagrange(C00, C10, C20, C30, frac.x);
    vec3 CP1X = CubicLagrange(C01, C11, C21, C31, frac.x);
    vec3 CP2X = CubicLagrange(C02, C12, C22, C32, frac.x);
    vec3 CP3X = CubicLagrange(C03, C13, C23, C33, frac.x);

    return CubicLagrange(CP0X, CP1X, CP2X, CP3X, frac.y);
}

2
বিট্রোটের ক্ষেত্রে আপনি এখানে প্রাসঙ্গিক শেডার কোডটি পোস্ট করতে পারেন, না?
joojaa

1
শেডার কোডের জন্য আমাদের কিছু সুন্দর কোড মার্কআপ থাকা উচিত, যদি কেউ আমাকে এটির কাছে না মারেন তবে আমি মেটাতে পোস্ট করব!
অ্যালান ওল্ফ

আমাদের সিনট্যাক্স হাইলাইট করে আচ্ছাদিত ভাষার তালিকায় কি এটি একটি নির্দিষ্ট শেডার ভাষা উপলভ্য নয়?
ট্রাইকোপলাক্স

আমি নিশ্চিত নই. এটি কেবল জিএলএসএল (ওয়েবগেল থেকে নির্ভুল হতে!)। কোডের প্রতিটি লাইনের আগে আমি কেবল 4 টি স্পেস করেছি, এটি চিহ্নিত করার আরও ভাল উপায় আছে কিনা তা আমি নিশ্চিত নই ...
অ্যালান ওল্ফ

উত্তর:


8

দেখা গেছে যে না, আপনি যখন বিকিউবিক টেক্সচার স্যাম্পলিংয়ের জন্য বিকাবিক লাগারঞ্জ ইন্টারপোলেশন ব্যবহার করতে পারেন, এটি সর্বোচ্চ মানের বিকল্প নয় এবং সম্ভবত এটি সম্ভবত ব্যবহারের সম্ভাবনা নেই।

কিউবিক হার্মাইট স্প্লাইস কাজের জন্য একটি ভাল সরঞ্জাম।

ল্যাংরেজ ইন্টারপোলেশন একটি বক্ররেখা তৈরি করবে যা ডেটা পয়েন্টগুলির মধ্য দিয়ে যায়, এভাবে C0 ধারাবাহিকতা সংরক্ষণ করে, তবে হার্মাইট স্প্লাইজগুলি প্রান্তে ডেরিভেটিভগুলি সংরক্ষণ করে এবং ডাটা পয়েন্টগুলির মধ্য দিয়ে যাওয়ার সময়, এভাবে C1 ধারাবাহিকতা সংরক্ষণ করে এবং আরও ভাল দেখায়।

এই প্রশ্নটিতে কিউবিক হার্মাইট স্প্লাইনে কিছু দুর্দান্ত তথ্য রয়েছে: /signals/18265/bicubic-interpolation

আমি প্রশ্নটিতে পোস্ট করা কোডটির কিউবিক হার্মাইট সংস্করণটি এখানে:

//=======================================================================================
vec3 CubicHermite (vec3 A, vec3 B, vec3 C, vec3 D, float t)
{
    float t2 = t*t;
    float t3 = t*t*t;
    vec3 a = -A/2.0 + (3.0*B)/2.0 - (3.0*C)/2.0 + D/2.0;
    vec3 b = A - (5.0*B)/2.0 + 2.0*C - D / 2.0;
    vec3 c = -A/2.0 + C/2.0;
    vec3 d = B;

    return a*t3 + b*t2 + c*t + d;
}

//=======================================================================================
vec3 BicubicHermiteTextureSample (vec2 P)
{
    vec2 pixel = P * c_textureSize + 0.5;

    vec2 frac = fract(pixel);
    pixel = floor(pixel) / c_textureSize - vec2(c_onePixel/2.0);

    vec3 C00 = texture2D(iChannel0, pixel + vec2(-c_onePixel ,-c_onePixel)).rgb;
    vec3 C10 = texture2D(iChannel0, pixel + vec2( 0.0        ,-c_onePixel)).rgb;
    vec3 C20 = texture2D(iChannel0, pixel + vec2( c_onePixel ,-c_onePixel)).rgb;
    vec3 C30 = texture2D(iChannel0, pixel + vec2( c_twoPixels,-c_onePixel)).rgb;

    vec3 C01 = texture2D(iChannel0, pixel + vec2(-c_onePixel , 0.0)).rgb;
    vec3 C11 = texture2D(iChannel0, pixel + vec2( 0.0        , 0.0)).rgb;
    vec3 C21 = texture2D(iChannel0, pixel + vec2( c_onePixel , 0.0)).rgb;
    vec3 C31 = texture2D(iChannel0, pixel + vec2( c_twoPixels, 0.0)).rgb;    

    vec3 C02 = texture2D(iChannel0, pixel + vec2(-c_onePixel , c_onePixel)).rgb;
    vec3 C12 = texture2D(iChannel0, pixel + vec2( 0.0        , c_onePixel)).rgb;
    vec3 C22 = texture2D(iChannel0, pixel + vec2( c_onePixel , c_onePixel)).rgb;
    vec3 C32 = texture2D(iChannel0, pixel + vec2( c_twoPixels, c_onePixel)).rgb;    

    vec3 C03 = texture2D(iChannel0, pixel + vec2(-c_onePixel , c_twoPixels)).rgb;
    vec3 C13 = texture2D(iChannel0, pixel + vec2( 0.0        , c_twoPixels)).rgb;
    vec3 C23 = texture2D(iChannel0, pixel + vec2( c_onePixel , c_twoPixels)).rgb;
    vec3 C33 = texture2D(iChannel0, pixel + vec2( c_twoPixels, c_twoPixels)).rgb;    

    vec3 CP0X = CubicHermite(C00, C10, C20, C30, frac.x);
    vec3 CP1X = CubicHermite(C01, C11, C21, C31, frac.x);
    vec3 CP2X = CubicHermite(C02, C12, C22, C32, frac.x);
    vec3 CP3X = CubicHermite(C03, C13, C23, C33, frac.x);

    return CubicHermite(CP0X, CP1X, CP2X, CP3X, frac.y);
}

নমুনা পদ্ধতিগুলির মধ্যে পার্থক্য দেখানো একটি চিত্র এখানে। বাম থেকে ডানে: নিকটতম নিকটবর্তী, বিলিনিয়ার, ল্যাঞ্জরেজ বিউকুবিক, হার্মাইট বিকিউবিক

এখানে চিত্র বর্ণনা লিখুন


যদিও সমস্ত কিউবিক স্প্লাইন এক অর্থে সমতুল্য, এটি সম্ভবত ক্যাটমুল-রোমের স্প্লিংগুলি ব্যবহার করা ধারণাগতভাবে সহজ। যেমন cs.cmu.edu/~462/projects/assn2/assn2/catmullRom.pdf
সাইমন এফ

আপনি কি মনে করেন যে এই ক্ষেত্রে টাউ প্যারামিটার সাহায্য করে বা বাধা দেয়? আমি ভুল হতে পারি তবে আমার কাছে মনে হচ্ছে ক্যাটমুল রোম খুব "ব্যবহারকারী সংজ্ঞায়িত" (এবং এটি টিউন করা আবশ্যক), অন্যদিকে হারমাইট স্প্লাইন সেখানে থাকা ডেটা থেকে তথ্য ব্যবহার করার চেষ্টা করে। দেখে মনে হচ্ছে কিউবিক হারমেট একটি "স্থল সত্য" এর কাছাকাছি, যা আমার ধারণা একটি আদর্শ সিনক ফিল্টারের মতো হবে। যদিও আপনি কি মনে করেন?
অ্যালান ওল্ফ

ক্যাটমুল-রোম কীভাবে "ব্যবহারকারী সংজ্ঞায়িত" তা আমি দেখতে পাচ্ছি না। একবার আপনার 4 টি সংলগ্ন পয়েন্টের ক্রম থাকলে পি [আই -1], পি [i], পি [আমি + 1], পি [আমি + 2] (2 ডি ক্ষেত্রে 4x4) বক্রাকার অংশটি পি [i এর মধ্যে সংজ্ঞায়িত করা হয়েছে ] এবং পি [i + 1] এবং প্রতিবেশী বিভাগগুলিতে সি 1 অবিচ্ছিন্ন। একটি সিনক ফিল্টার অডিওর জন্য ঠিক আছে তবে ভিডিও নয়। মিচেল এবং নেত্রবালী দেখুন: cs.utexas.edu/~fussell/courses/cs384g-fall2013/lectures/… আইআইআরসি ক্যাটমুল-রোম তাদের প্রস্তাবিত ফিল্টারগুলির পরিবারের একটি বিশেষ ঘটনা, তবে আমি মনে করি যে ফিল্টারটি একটি আনুমানিক বাঁক তাই, সিআর এর বিপরীতে, মূল পয়েন্টগুলি অতিক্রম করতে পারে না।
সাইমন এফ

এইভাবে তিনি কীভাবে হারমাইট স্প্লাইনের কাজ করে তা ব্যতীত ক্যাটমুল রোম স্প্লাইনে অতিরিক্ত প্যারামিটার টাউ (টান) থাকে যা ব্যবহারকারীকে সংজ্ঞায়িত করা হয়। এছাড়াও, সিনকে ভিডিওতে প্রয়োগ করা হয়, ডিএসপি হ'ল ডিএসপি: পি
অ্যালান ওল্ফ

আমাকে অবশ্যই স্বীকার করতে হবে, আমি ক্যাটমুল রোমের সাথে সম্পর্কিত টেনশন প্যারামিটারটি আগে কখনও দেখিনি, তবে তারপরে আমি কেবল ফোলি এবং ভ্যান ড্যাম (এট আল) এর মাধ্যমে সেগুলি শিখেছি বা বলি, ওয়াট ও ওয়াট যা এএফএআইসিআর তৈরি করে যেমন কোন উল্লেখ নেই। প্রকৃতপক্ষে, এই বলে যে, চারটি প্রতিবন্ধকতা দেওয়া হয়েছে - যেমন বক্ররেখাটি 2 পয়েন্টের মধ্য দিয়ে যেতে হবে এবং দুটি সংজ্ঞায়িত স্পর্শকাত্তি থাকতে হবে ** এই পয়েন্টগুলিতে এবং এটি একটি ঘনক - আমি কীভাবে কিছু আছে তা নিয়ে ক্ষতির কিছুটা হলেও আছি একটি উত্তেজনা প্যারামিটার সমর্থন আরও ডিগ্রী স্বাধীনতা .... ** আপনি না বলতে চান স্পর্শকাতর ছোট করা যাবে?
সাইমন এফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.