hojjatjafary
hojjatjafary
خواندن ۵ دقیقه·۵ سال پیش

تصویر HDR یعنی چه؟

مفهوم (High dynamic range (HDR یا دامنهٔ پویای بالا در عکاسی، نمایشگرها و پرداخت (Render) تصاویر سه بعدی استفاده می‌شود که هر یک با روشهای مربوط به خود پیاده سازی می‌شود و دارای جزییات زیادی هستند، در اینجا به صورت خلاصه این مفهوم را بررسی می‌کنیم.

عکاسی

در ابتدا HDR فقط در عکاسی استفاده می‌شد به طوری که عکاس چندین عکس از یک صحنه یکسان را با سطوح نورگیری‌ (exposure levels) مختلف می‌‌گیرد، در واقع بازهٔ بزرگی از مقادیر رنگ را ذخیره می‌کند. این تصاویر ترکیب شده با هم یک تصویر HDR را می‌سازند طوری که بازهٔ جزییات بزرگتری مبتنی بر سطوح نورگیری مختلفی که با هم ترکیب شده‌اند یا نورگیری خاصی که با آن دیده می‌شود، در آن قابل مشاهده است. برای نمونه در تصویر زیر ناحیه‌هایی که نور روشنی دارند در نورگیری پایین جزییات بسیار بیشتری را نمایان می‌کنند (تصویر سمت چپ) اما این جزییات در نورگیری بالاتر دیده نمی‌شوند. در عوض در نورگیری بالاتر ناحیه‌های تاریکتر جزییات بیشتری را نشان می‌دهند که در حالت قبل قابل دیدن نبود (تصویر آپارتمانها در سمت راست).

این موضوع شباهت زیادی به نحوهٔ کار کردن چشم انسان دارد و اساس رندر HDR است. زمانی که نور کمی وجود دارد چشم انسان خود را با آن تطبیق می‌دهد بنابراین قسمت‌های تاریکتر بهتر دیده می‌شوند، همچنین به صورت مشابه در ناحیه‌های روشن قسمت های روشن بهتر دیده می‌شوند، مثل این می‌ماند که چشم انسان یک دستگاه نورگیری خودکار بر اساس میزان روشنایی صحنه دارد.

برای آشنایی بیشتر با نحوهٔ عکاسی HDR این ویدیو را تماشا کنید.

گرافیک سه بعدی

در گرافیک سه بعدی زمانی که مقادیر روشنایی و رنگها در framebuffer ذخیره می‌شوند باید به طور پیش فرض در بازه‌ٔ 0.0 تا 1.0 محدود شوند. در ابتدا این عبارت به ظاهر بدون اشکال باعث می‌شود زمانی که در حال چیدن صحنه هستیم مقادیر نور و رنگ را طوری مشخص کنیم که مقدار fragmentها جایی درون این بازه قرار گیرند. این روش کار می‌کند و با نتایج خوبی همراه است اما اگر ما به یک ناحیهٔ خاص روشن با منابع نور روشن برویم که مجموع نورها از 1.0 بیشتر شود، چه اتفاقی خواهد افتاد؟ پاسخ این است که تمام fragment هایی که جمع نور یا روشنایی آنها بیش از 1.0 شود به مقدار 1.0 محدود می‌شود، که چندان زیبا و تماشایی نیست:

به خاطر تعداد زیاد fragmentهایی که مقادیر رنگ آنها به 1.0 محدود شده است fragment ها در ناحیه‌های بزرگی مقدار رنگ سفید دقیقا یکسانی را خواهند داشت که باعث از دست رفتن قابل توجهی از جزییات تصویر شده و همچنین باعث ایجاد تصویری با ظاهر ساختگی و مصنوعی می‌شود.

یک راه حل برای این مشکل این خواهد بود که قدرت منابع نور را کاهش دهیم و مطمئن شویم که هیچ ناحیه از fragmentها در صحنه منجر به روشنایی بزرگتر از 1.0 نشود، این راه حل خوبی نیست چون شما را مجبور می‌کند تا از پارامترهای نور غیر واقعی استفاده کنید. راه بهتر این است که اجازه دهیم مقادیر رنگها به صورت موقت از 1.0 بیشتر شود و بعد به عنوان آخرین گام آنها را بدون از دست دادن جزییات به بازهٔ اصلی 0.0 و 1.0 تبدیل(transform) کنیم.

نمایشگرها محدود به نمایش رنگها در بازهٔ 0.0 و 1.0 هستند اما چنین محدودیتی در معادله‌های نورپردازی وجود ندارد. با دادن اجازهٔ عبور رنگهای fragment از 1.0 محدودهٔ رنگ بزرگتری از مقادیر رنگ داریم که برای کار روی آنها در درسترس است. این بازهٔ بزرگتر به (high dynamic range (HDR شناخته می‌شود. در این بازهٔ بزرگتر چیزهای روشن می‌توانند واقعا روشن باشند و چیزهای تاریک می‌توانند واقعا تاریک باشند و در عین حال جزییات در هر دو قابل مشاهده باشد.

پرداخت HDR کمی مشابه چشم انسان کار می‌کند. در واقع اجازه می‌دهیم تا بازهٔ خیلی بزرگتری از مقادیر رنگ پرداخت شود و بازهٔ بزرگی از جزییات تاریک و روشن صحنه را جمع آوری کنیم و در نهایت همهٔ مقادیر HDR را به بازهٔ کوچک (low dynamic range (LDR با مقادیر [1.0, 0.0] تبدیل می‌کنیم. فرآیند تبدیل مقادیر HDR به مقادیر LDR را tone mapping می‌گویند. مجموعهٔ بزرگی از الگوریتم‌های tone mapping وجود دارد که هدف آنها نگهداری بیشترین جزییات HDR در فرآیند تبدیل است. گاهی این الگوریتم ها دارای یک پارامتر نورگیری هستند که اجازهٔ انتخاب ناحیه‌های روشن یا تاریک را به ما می‌دهد.

در مورد real-time rendering نه تنها HDR به ما اجازه می‌دهد که از بازهٔ LDR مربوط به [1.0, 0.0] عبور کنیم و جزییات بیشتر را نگه داریم بلکه این قابلیت را می‌دهد که شدت منابع نور را با مقدار واقعی آنها مشخص کنیم. برای نمونه نور خورشید شدت بسیار بیشتری نسبت به چیزی مثل چراغ قوه دارد بنابراین چرا نور خورشید را به این صورت پیکربندی نکنیم. در این صورت ما اجازه داریم که نورهای صحنه را درست‌تر و با پارامترهای نور واقعی‌تر پیکربندی کنیم، چیزی که با رندر LDR ممکن نخواهد بود چرا که مقادیر به صورت مستقیم به 1.0 محدود می‌شوند.

از آنجایی که نمایشگرها فقط رنگهای درون بازهٔ 0.0 و 1.0 را نشان می‌دهند نیاز داریم که مقادیر رنگ دامنهٔ پویای بالای جاری را به دامنهٔ نمایشگر تبدیل کنیم. صرف تبدیل و بازگرداندن رنگها با یک میانگین ساده خیلی به ما کمک نخواهد کرد چون ناحیه‌های روشن همچنان خیلی بیشتر غالب خواهند شد. به هر حال کاری که می‌توانیم انجام دهیم استفاده از معادله‌های مختلف و یا منحنی‌هایی است که مقادیر HDR را به LDR تبدیل کند و به ما کنترل کاملی روی روشنایی صحنه بدهد. این همان فرآیندی است که پیشتر به عنوان tone mapping معرفی کردیم و آخرین مرحلهٔ رندر HDR است.

برای پیاده سازی HDR باید از framebuffer هایی استفاده کنیم که به ما اجازهٔ ذخیره مقادیر بزرگ را بدهد بنابراین معمولا از framebuffer هایی با مقادیر float32 استفاده می‌شود.

ویدیو

برای بهره مندی از ویژگی های HDR در تصاویر ویدیویی نیاز به تجهیزات ضبط، ذخیره سازی و کدگذاری و نمایش خاصی است. برای مثال برای ضبط روشنایی تصویر به جای ۸ بیتی که در روش‌های SDR استفاده می‌شد، از ۱۰ بیت داده استفاده می‌شود.
اولین دوربینی که قابلیت ضبط تصاویر HDR داشت در سال ۱۹۹۰ معرفی شد که با ترکیب دو تصویری که پشت سر هم گرفته شده‌اند کار می‌کرد. یک سال بعد اولین دوربین تجاری HDR عرضه شد.
به مرور این تکنولوژی رشد کرد و به نمایشگرها رسید، برای همین نیاز به رابط خاصی برای انتقال تصاویر HDR به نمایشگر وجود داشت که در سال ۲۰۱۵ پشتیبانی آن در نسخه HDMI 2.0a اضافه شد.
هم اکنون تکنولوژی HDR در اکثر تلویزیون‌ها و نمایشگرهای متوسط به بالا و حتی گوشی‌های همراه به راحتی در دسترس است.


منابع:

https://en.wikipedia.org/wiki/High_dynamic_range
https://en.wikipedia.org/wiki/High-dynamic-range_imaging
https://learnopengl.com/Advanced-Lighting/HDR
https://en.wikipedia.org/wiki/High-dynamic-range_video
https://en.wikipedia.org/wiki/High-dynamic-range_rendering
https://www.youtube.com/watch?v=aDZg8vBVYZU

بازی کامپیوتریبرنامه نویسیگرافیکhdr
کسی که می خواهد برنامه نویس بماند، برنامه نویس شرکت فن افزار، بازی ساز، گرشاسپ راز اژدها، شمشیر تاریکی...
شاید از این پست‌ها خوشتان بیاید