গোলমাল দমন করার উপযুক্ত উপায় কী?


9

রঙের গভীরতা হ্রাস করতে এবং 2 বিট শব্দ সহকারে (n =] 0.5,1.5 [এবং আউটপুট = তল (ইনপুট * (2 ^ বিট -1) + এন)) সহ, মান সীমাটির শেষ (0.0 এবং 1.0 ইনপুটগুলি) ) গোলমাল। এগুলি দৃ solid় রঙের হওয়া বাঞ্চনীয় হবে।

উদাহরণ: https://www.shadertoy.com/view/llsfz4

নয়েজ গ্রেডিয়েন্ট (উপরের শেডারটোয়ের স্ক্রিনশট রয়েছে, একটি গ্রেডিয়েন্ট এবং উভয় প্রান্তের চিত্র যা যথাক্রমে শক্ত সাদা এবং কালো হওয়া উচিত , তবে এর পরিবর্তে গোলমাল রয়েছে)

সমস্যাটি কেবলমাত্র মান সীমাটি সংক্ষেপ করে সমাধান করা যেতে পারে যাতে প্রান্তগুলি সর্বদা একক মানগুলিতে গোল হয়। যদিও এটি কিছুটা হ্যাক অনুভব করে, এবং আমি ভাবছি যে এই "সঠিকভাবে" প্রয়োগ করার কোনও উপায় আছে কিনা?


কোনও কারণে শেডারটোয় আমার ব্রাউজারে চলেনি। আপনি কী বোঝাতে চেয়েছেন আপনি কোনও / কিছু সাধারণ চিত্র (গুলি) পোস্ট করতে পারেন?
সাইমন এফ

1
এটি আরও বেশি হওয়া উচিত নয় এন =] - 1, 1 [?
জার্ককোএল

@ জারকোএল ওয়েল ফ্লোটিং পয়েন্টকে পূর্ণসংখ্যায় রূপান্তর করার সূত্রটি হ'ল আউটপুট = ফ্লোর (ইনপুট * ইনটাম্যাক্স + এন), যেখানে এন = 0.5 বিনা শোনায়, কারণ আপনি (উদাহরণস্বরূপ)> = 0.5 গোল করতে চান, তবে <0.5 টি নীচে। এই কারণে গোলমালটি "কেন্দ্রিক" হয় 0.5 তে।
হটমল্টিমিডিয়া

@ সিমোনএফ শেডারটোয়ের চিত্র যুক্ত করেছে
হটমল্টিমিডিয়া

1
দেখে মনে হচ্ছে আপনি আউটপুটটিকে গোল করার চেয়ে কাটাচ্ছেন ( জিপিইউগুলির মতো) - পরিবর্তে গোল করুন, কমপক্ষে আপনি সঠিক সাদা পাবেন: shadertoy.com/view/MlsfD7 (চিত্র: i.stack.imgur.com/kxQWl.png )
মিক্কেল গিজোয়েল

উত্তর:


8

টিএল; ডিআর: 2 * 1LSB ত্রিভুজাকার-পিডিএফ ক্লাইমিংয়ের কারণে 0 এবং 1 এ প্রান্তক্যাসগুলিতে বিরতি দেয়। একটি সমাধান হ'ল সেই কিনারাগুলিতে 1 বিট ইউনিফর্মের দিকে r

আমি এটির দ্বিতীয়টি যুক্ত করছি, যা দেখলাম এটি মূলত যা ভাবা হয়েছিল তার থেকে কিছুটা জটিল। দেখা যাচ্ছে যে এই সমস্যাটি একটি "টোডো: ক্ল্যাম্পিং দরকার?" আমার কোডটিতে যেহেতু আমি ২০১২ সালে ... সাধারণ থেকে ত্রিভুজাকৃতির normalেঁকিতে সরিয়ে নিয়েছি ... অবশেষে এটি দেখতে ভালই লাগছে :) পোস্টের জন্য সমাধান / চিত্রগুলির সম্পূর্ণ কোড: https://www.shadertoy.com/view/llXfzS

প্রথমত, 2 * 1LSB ত্রিভুজাকার-পিডিএফ দুরত্বের সাহায্যে 3 বিটগুলিতে সংকেত মাপানোর সময় আমরা এখানে যে সমস্যাটি দেখছি is

আউটপুট - মূলত হটমল্টিমিডিয়া যা দেখায়।

বিপরীতে ক্রমবর্ধমান, প্রশ্নের বর্ণিত প্রভাবটি সুস্পষ্ট হয়ে ওঠে: আউটপুট গড় / ধীরে ধীরে ধীরে ধীরে সাদা / সাদা হয় না (এবং এটি করার আগে 0/1 এর বাইরেও ভাল প্রসারিত হয়)।

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

গ্রাফের দিকে তাকানো কিছুটা অন্তর্দৃষ্টি দেয়:

এখানে চিত্র বর্ণনা লিখুন (ধূসর রেখাগুলি 0/1 চিহ্নিত করে, এছাড়াও ধূসর বর্ণের মধ্যে আমরা আউটপুট দেওয়ার চেষ্টা করছি এমন সিগন্যাল, হলুদ-রেখাটি গড় মাপসই / কোয়ান্টাইটিজ আউটপুট গড়, লাল ত্রুটি (সংকেত-গড়))।

মজার বিষয় হল, কেবলমাত্র গড় আউটপুট সীমাতে 0/1 নয়, এটি লিনিয়ারও নয় (শব্দটি ত্রিভুজাকার পিডিএফের কারণে সম্ভবত)। নিম্ন প্রান্তের দিকে তাকালে, এটি স্বজ্ঞাত অর্থে তৈরি করে যে আউটপুটটি কেন ডাইভারেজ হয়: যেহেতু আঁকানো সংকেতটি নেতিবাচক মানগুলি অন্তর্ভুক্ত করতে শুরু করে, ক্ল্যাম্পিং-অন-আউটপুট আউটপুটটির নীচের অংশের (যেমন নেতিবাচক মানগুলি) এর মান পরিবর্তন করে by গড় মূল্য বৃদ্ধি। একটি চিত্র সজ্জিত বলে মনে হচ্ছে (অভিন্ন, প্রতিসাম্য 2LSB, এখনও হলুদ মধ্যে গড়):

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

এখন, আমরা যদি কেবল 1LSB স্বাভাবিককরণের জায়গাটি ব্যবহার করি তবে কিনারা-কেসগুলিতে মোটেই সমস্যা নেই, তবে অবশ্যই আমরা ত্রিভুজাকৃতির দোহাইয়ের দুর্দান্ত বৈশিষ্ট্যগুলি হারাব (উদাহরণস্বরূপ এই উপস্থাপনাটি দেখুন )।

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

একটি (বাস্তববাদী, অভিজ্ঞতামূলক) সমাধান (হ্যাক) এর পরে, [-0.5; 0.5 [প্রান্তকেসের জন্য অভিন্ন দৌড়তে ফিরে যেতে হবে:

float dithertri = (rnd.x + rnd.y - 1.0); //note: symmetric, triangular dither, [-1;1[
float dithernorm = rnd.x - 0.5; //note: symmetric, uniform dither [-0.5;0.5[

float sizt_lo = clamp( v/(0.5/7.0), 0.0, 1.0 );
float sizt_hi = 1.0 - clamp( (v-6.5/7.0)/(1.0-6.5/7.0), 0.0, 1.0 );

dither = lerp( dithernorm, dithertri, min(sizt_lo, sizt_hi) );

বাকী পরিসরের জন্য ত্রিভুজাকার ঘূর্ণন অক্ষত রাখার সময় যা কিনারাগুলি স্থির করে:

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

সুতরাং আপনার প্রশ্নের উত্তর না দেওয়ার জন্য: আরও গাণিতিকভাবে কঠিন সমাধান আছে কিনা তা আমি জানি না এবং অতীত মাস্টার্স অফ পাস্ট কী করেছে তা জানতে সমানভাবে আগ্রহী: ততক্ষণ পর্যন্ত কমপক্ষে আমাদের কোডটি কার্যকর রাখতে আমাদের এই ভয়াবহ হ্যাক রয়েছে।

সম্পাদনাটি
সম্ভবত আমার সিগন্যালটি সংকুচিত করার বিষয়ে প্রশ্নটিতে প্রদত্ত কার্য-পরামর্শ-পরামর্শটি সম্ভবত cover েকে রাখা উচিত। গড়টি প্রান্তরেখাগুলিতে গড় রৈখিক নয়, কেবল ইনপুট-সংকেতকে সংকুচিত করে নিখুঁত ফলাফল দেয় না - যদিও এটি শেষের দিকগুলি ঠিক করে দেয়: এখানে চিত্র বর্ণনা লিখুন

তথ্যসূত্র


এটি আশ্চর্যজনক যে প্রান্তগুলিতে লার্প একটি নিখুঁত দেখার ফলাফল দেয়। আমি কমপক্ষে কিছুটা বিচ্যুতি আশা করব: পি
অ্যালান ওল্ফ

হ্যাঁ, আমি ইতিবাচকভাবেও বিস্মিত হয়েছিলাম :) আমি বিশ্বাস করি এটি কার্যকর হয় কারণ আমরা একই হারে সংকেত হ্রাস পাচ্ছে, একইভাবে নিম্ন-প্রান্তের প্রশস্ততা কমিয়ে দিচ্ছি। তাহলে কমপক্ষে কমপক্ষে স্কেল মেলে ... তবে আমি সম্মত হই যে এটি বিতর্কিত যে সরাসরি বিতরণের মিশ্রণের কোনও নেতিবাচক পার্শ্ব-প্রতিক্রিয়া নেই বলে মনে হয়।
মিক্কেল গিজোয়েল

@ মিকেলজেজেল দুর্ভাগ্যক্রমে, আপনার কোডটিতে একটি বাগের কারণে আপনার বিশ্বাসটি ভুল। আপনি উভয়ের জন্য dithertriএবং dithernormএকটি স্বতন্ত্র পরিবর্তে একই আরএনজি পুনরায় ব্যবহার করেছেন । একবার আপনি সমস্ত গণিতের সাথে কাজ করার পরে এবং সমস্ত পদ বাতিল করে দিলে আপনি দেখতে পাবেন যে আপনি মোটেও ঝুঁকছেন না! পরিবর্তে, কোডটি v < 0.5 / depth || v > 1 - 0.5/depthতাত্ক্ষণিকভাবে সেখানে অভিন্ন বিতরণে স্যুইচ করাতে কঠোর কাটঅফের মতো কাজ করে । এটি আপনার যে সুন্দর দুরত্ব থেকে দূরে সরে যায় তা নয়, এটি কেবল অযথা জটিল। বাগ ঠিক করা আসলে খারাপ, আপনি আরও খারাপ দিক দিয়ে শেষ করবেন। কেবল একটি হার্ড কাট অফ ব্যবহার করুন।
orlp

আরও গভীর খননের পরে আমি আপনার শেডারটোয়ায় আরও একটি সমস্যা পেয়েছি যেখানে নমুনাগুলির গড় গড় দেওয়ার সময় আপনি গামা-সংশোধন করেন না (আপনার গড় এসআরজিবি স্থান রয়েছে যা লিনিয়ার নয়)। আপনি যদি গামা যথাযথভাবে পরিচালনা করেন তবে আমরা দেখতে পেলাম যে দুর্ভাগ্যক্রমে আমরা এখনও শেষ করি নি। গামার সংশোধন মোকাবেলা করতে আমাদের অবশ্যই আমাদের গোলমালকে আকার দিতে হবে। সমস্যাটি প্রকাশ করার জন্য এখানে একটি শেডারটোই রয়েছে: shadertoy.com/view/3tf3Dn । আমি একগুচ্ছ জিনিস চেষ্টা করেছি এবং এটি কাজ করতে পারিনি, তাই আমি এখানে একটি প্রশ্ন পোস্ট করেছি: কম্পিউটারগ্রাফিক্স.সেটেকেক্সচেঞ্জ / প্রশ্নগুলি / ৮৮৯৩/২
orlp

3

আমি নিশ্চিত নই যে আমি আপনার প্রশ্নের পুরো উত্তর দিতে পারব, তবে আমি কিছু চিন্তাভাবনা যুক্ত করব এবং সম্ভবত আমরা একসাথে উত্তরটি পৌঁছে দিতে পারি :)

প্রথমত, প্রশ্নের ভিত্তিটি আমার কাছে কিছুটা অস্পষ্ট: আপনি যখন অন্য প্রতিটি বর্ণের শব্দ করে থাকেন তখন আপনি কেন পরিষ্কার / সাদা সাদা হওয়া বাঞ্ছনীয় মনে করেন? ঘোরাফেরা করার পরে আদর্শ ফলাফলটি সম্পূর্ণ অভিন্ন শব্দের সাথে আপনার মূল সংকেত। যদি কালো এবং সাদা আলাদা হয় তবে আপনার শব্দটি সিগন্যাল-নির্ভর হয়ে উঠবে (যা ভাল হতে পারে, যেহেতু এটি ঘটে যেখানে রঙ যেভাবেই ক্ল্যাম্প করা হয়)।

এতে বলা হয়েছে, এমন পরিস্থিতি রয়েছে যেখানে শ্বেত বা কৃষ্ণাঙ্গের মধ্যে শোরগোল পড়ে একটি সমস্যা তৈরি হয় (আমি ব্যবহারকারীর ক্ষেত্রে সচেতন নই যেগুলি একই সাথে "পরিষ্কার" হওয়ার জন্য কালো এবং সাদা উভয় প্রয়োজন): যখন একটি সংযোজনযুক্ত মিশ্রিত কণাকে কোয়াড হিসাবে উপস্থাপন করার সময় একটি টেক্সচার, আপনি পুরো কোয়াডে গোলমাল যুক্ত করতে চান না, কারণ এটি জমিনের বাইরেও প্রদর্শিত হবে। একটি সমাধান হ'ল শব্দের অফসেট করা, সুতরাং [-0.5; 1.5 যোগ করার পরিবর্তে [আপনি [-২.০; ০.০ [যোগ করেন (অর্থাত্ শব্দের 2 বিট বিয়োগ))। এটি বেশ অভিজ্ঞতামূলক সমাধান, তবে আমি আরও সঠিক পদ্ধতির বিষয়ে অবগত নই। এটি নিয়ে ভাবনা, আপনি সম্ভবত হারিয়ে যাওয়া তীব্রতার জন্য ক্ষতিপূরণ দেওয়ার জন্য আপনার সংকেতটি বাড়িয়ে তুলতে চান ...

কিছুটা সম্পর্কিত, টিমোথিয় লোটস বর্ণালীটির উজ্জ্বল প্রান্তে শব্দটি হ্রাস করার জন্য যেখানে বর্ণনীর সর্বাধিক প্রয়োজন সেখানে শব্দ তৈরি করার বিষয়ে একটি জিডিসি আলোচনা করেছিলেন: http://32ipi028l5q82yhj72224m8j-wpengine.netdna-ssl.com/wp- বিষয়বস্তু / আপলোড / 2016/03 / GdcVdrLottes.pdf


(দুঃখিত, আমি দুর্ঘটনাক্রমে প্রবেশ করলাম এবং সময় সীমাটি মেয়াদোত্তীর্ণের মেয়াদ উত্তীর্ণ হয়ে গেল) উদাহরণটিতে ইউসকেস এমন একটি পরিস্থিতি যেখানে এটি বিবেচনা করবে: একটি 3-বিট ডিসপ্লে ডিভাইসে একটি ভাসমান পয়েন্ট গ্রেস্কেল চিত্র উপস্থাপন করা। এখানে কেবল এলএসবি পরিবর্তন করে তীব্রতা ব্যাপকভাবে পরিবর্তিত হয়। আমি বোঝার চেষ্টা করছি যে মানগুলির পরিসীমা সংকোচনের মতো শেষের মানগুলি পরিপূর্ণ করার মতো কোনও শেষ রঙের মানচিত্রের কোনও "সঠিক উপায়" রয়েছে কিনা? এবং এর গাণিতিক ব্যাখ্যা কি? উদাহরণ সূত্রে, 1.0 এর ইনপুট মান গড় 7 এর আউটপুট উত্পাদন করে না এবং এটিই আমাকে বিরক্ত করে।
হটমল্টিমিডিয়া

1

আমি মিক্কেল গিজোলের ধারণাকে ত্রিভুজাকার শব্দ দিয়ে দূরে রাখার একটি সহজ ফাংশনকে সহজ করে তুলেছি যার জন্য কেবল একটি একক আরএনজি কল প্রয়োজন। আমি সমস্ত অপ্রয়োজনীয় বিট ছিনিয়ে নিয়েছি যাতে এটি খুব পঠনযোগ্য এবং বোধগম্য হয় যা ঘটছে:

// Dithers and quantizes color value c in [0, 1] to the given color depth.
// It's expected that rng contains a uniform random variable on [0, 1].
uint dither_quantize(float c, uint depth, float rng) {
    float cmax = float(depth) - 1.0;
    float ci = c * cmax;

    float d;
    if (ci < 0.5 || ci >= cmax - 0.5) {
        // Uniform distribution on [-0.5, 0.5] for edges.
        d = rng - 0.5;
    } else {
        // Symmetric triangular distribution on [-1, 1].
        d = (rng < 0.5) ? sqrt(2.0 * rng) - 1.0 : 1.0 - sqrt(2.0 - 2.0*rng);
    }

    return uint(clamp(ci + d + 0.5, 0.0, cmax));
}

ধারণা এবং প্রসঙ্গে আমি আপনাকে মিক্কেল জিজোয়েল এর উত্তরটি উল্লেখ করব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.