کار با عکس های HDR در پردازش تصویر

چاپ

در این مقاله با موارد زیر آشنا خواهید شد:

  1. مقدمه
  2. نحوه ی خواندن عکس های HDR
  3. ایجاد یک عکس HDR
  4. مشاهده ی یک عکس HDR
  5. نوشتن یک عکس HDR در یک فایل

 مقدمه

HDR مخفف کلمات High Dynamic Range می باشد. عبارت Dynamic range به معنی محدوده ی سطوح روشنایی، از سطح تاریکی تا سطح روشنایی است. محدوده ی دینامیکی منظره های جهان واقعی، نسبتاً بالا است. عکس ها با محدوده ی دینامیکی بالا، که از این پس آنها را HDR می نامیم، تلاش می کنند تا طیف وسیعی از رنگ های مناظر جهان واقعی را دریافت کنند. این عکس ها از مقادیر 32 بیتی ممیز شناور برای ذخیره ی هر کانال رنگ استفاده می کنند. عکس های HDR دربردارنده ی جزئیات سطح بالایی هستند به طوری که به محدوده ی دید انسان نزدیک هستند. 

جعبه ابزار متلب، حاوی توابعی برای خواندن و ایجاد کردن و نوشتن عکسهای HRD است. همچنین این جعبه ابزار، حاوی یک عملگر نگاشت تن(tone-map) برای نمایش دادن عکس های HDR بر روی مانیتور کامپیوتر است. 


خواندن یک عکس HDR

 برای خواندنیک عکس HDR در متلب، می توانید از تابع hdrread استفاده نمایید. 

مثال (کار با عکس های HDR در پردازش تصویر)

hdr_image = hdrread('office.hdr');

خروجی عکس hder_image در بالا، یک عکس با ابعاد \(m\times n\times 3\) و از نوع single است. 

 

مثال (کار با عکس های HDR در پردازش تصویر)

اما توجه کنید که، قبل از اینکه بتوانید یک عکس HDR را نمایش دهید، باید آن را به یک محدوده ی داینامیک تبدیل کنید که برای صفحه ی نمایش یک کامپیوتر مناسب باشد. به این عمل نگاشتن تن(tone mapping) گفته می شود. الگوریتم های نگاشت تن، محدوده ی داینامیک را کاهش می دهند در حالی که سعی بر این دارند که ظاهر و کیفیت عکس اصلی را حفظ کنند. 


ایجاد یک عکس HDR

برای ایجاد یک عکس HDR از چند عکس با محدوده ی داینامیک کمتر، می توانید از تابع makehdr استفاده کنید. توجه کنید که، این عکس ها با محدوده ی دینامیکی کمتر، باید از لحاظ فضایی با یکدیگر منطبق باشند، و فایل های این عکس ها باید حاوی داده های متای  EXIF باشند. همچنین عکس ها با محدوده ی دینامیکی پایین، را در یک آرایه ی سلولی قرار دهید. 

 

مثال (کار با عکس های HDR در پردازش تصویر)

hdr_image = makehdr(files);

مشاهده ی یک عکس HDR

اگر تلاش کنید تا یک عکس HDR را با استفاده از دستور imshow مشاهده کنید، این عکس به درستی نشان داده نخواهد شد:

برای مشاهده ی یک عکس HDR، ابتدا باید داده های خود را به یک محدوده ی دینامیکی تبدیل کنیم تا بتواند به درستی در کامپیوتر نمایش داده شود. از تابع tonemap می توان برای انجام این تبدیل، استفاده نمود. تابع tonemap یک عکس HDR را به یک عکس RGB از نوع uint8 تبدیل می کند:

مثال (کار با عکس های HDR در پردازش تصویر)

پس از تبدیل عکس HDR خود، می توانید آن را نمایش دهید:

 

مثال (کار با عکس های HDR در پردازش تصویر)

imshow(rgb);


نوشتن یک عکس HDR در یک فایل

برای نوشتن یک عکس HDR در یک فایل، می توانید از تابع hdrwrite استفاده کنید:

مثال (کار با عکس های HDR در پردازش تصویر)

hdrwrite(hdr,'filename');