تنظیم شدت روشنایی تصویر در متلب
توضیحات ویدئو
Intensity transforms در اصطلاح یعنی تبدیلات شدت نور ،که زیر مجموعه Image Enhansment است. در واقع ما بر اساس روشنایی و شدت نور هر بخش، پردازشهایی به منظور واضحتر شدن تصویر انجام می دهیم.
یک تابع مهم در حوزه Intensity transforms، تابع( Imadjust)است که کار ان در اصطلاح،تغییر روشنایی و تبدیل تصویر به یک تصویر واضح تر با یک نگاشت خطی اشباع شده است. در واقع این تابع واریانس (پراکندگی) شدت روشنایی پیکسلهای تصویر را زیاد میکند. بدین ترتیب رنگ سفید سفیدتر و رنگ مشکی مشکیتر می شود و کنتراست (تفاوت شدت روشنایی) تصویر را زیاد می کند. (در تصویر اصلی که انتخاب کردیم واریانس تصویر کم بود سپس با استفاده از تابع Imadjust واریانس تصویر را زیاد کردیم ودر نتیجه تصویر واضح تر شد ). تابع imadjust کم ترین و بیش ترین مقدار روشنایی تصویر ورودی را پیدا می کند سپس ان را با استفاده از نگاشتی به کمترین و بیش ترین مقدار خروجی ممکن میبرد:
img=imadjust(img1)
در تابع بالا چون مقادیر ماتریس ورودی را تعیین نکردیم، تابع به صورت خودکار کم ترین و بیشترین مقدار تصویر ورودی را بدست میآورد و با نگاشتی به 0 و 1 خروجی می برد. حال سوال پیش می آید که ایا میشود خودمان به صورت دستی کم ترین و بیش ترین مقدار ورودی محاسبه کنیم؟ بله، با استفاده از تابع stretchlim که به صورت خودکار کم ترین و بیش ترین مقدار روشنایی ورودی را بدست می آورد. همچنین تابع imadjust می تواند پارامتری به نام گاما به عنوان ورودی بپذیرد. اگر گاما بزرگتر از 1 بدهیم تصویر به رنگ مشکی میل میکند و اگر کم تر از 1 بدهیم تصویر به رنگ 0 میل میکند( باید بهترین عدد پیدا کنیم مثلا در کد زیر گاما برابر 0.5 است)
img3=imadjust(img1,stretchlim(img1),[0 1],0.5)
علاوه بر خود تصویر بهبود یافته، نحوه عملکرد تابع imadjust و نتایج اعمال این تابع را با رسم هیستوگرام تصویر بهتر میتوان بررسی کرد. برای رسم هیستوگرام تصویر میتوانیم از تابعی به نام (imhist) استفاده کنیم که فراوانی هر یک از مقادیر روشنایی پیکسلها را نمایش میدهد. در ادامه کدهای این روش را مشاهده میکنید:
کدهای پروژه
clc;
clear;
close all;
%%load image
img1=imread(‘pout.tif’);
img2=imadjust(img1);
img3=imadjust(img1,stretchlim(img1),[0 1],0.5);
img4=histeq(img1)
%%img4=imadjust(img1,stretchlim(img1),[0 1],2 );
figure;
subplot(2,2,1);
imshow(img1);
title(‘orginal image’);
subplot(2,2,2);
imshow(img2);
title(‘Result of imadjust’);
subplot(2,2,3);
imshow(img3);
title(‘Result of imadjust(2)’);
subplot(2,2,4);
imshow(img4);
title(‘Result of hesteq’);
figure;
subplot(2,2,1);
imhist(img1,256);
title(‘orginal image’);
subplot(2,2,2);
imhist(img2,256);
title(‘Result of imadjust’);
subplot(2,2,3);
imhist(img3,256);
title(‘Result of imadjust(2)’);
subplot(2,2,4);
imhist(img4,256);
title(‘Result of hesteq’);
یکی دیگر از پردازشهای حوزه Intensity transforms، موضوع Histogram processing است. یعنی بر خلاف حالات قبل، مستقیم بر روی هیستوگرام پردازش هایی انجام شود. در اینجا یک تابع مهم به نام (histeq ) وجود دارد که کار آن به نوعی بهینه سازی شدت روشنایی تصویر است. در واقع تابع histeq با یکنواخت کردن هیستوگرام تا حد امکان و افزایش پراکندگی تصویر واضح تری به ما خواهد داد.
یک امکان جالب دیگر، تبدیل تصویر اولیه با استفاده از تابع تطبیق تاریکی (Histogram Equalization) به تصویر اصلاح شده است. در واقع ما می توانیم یک تابع به نام تابع هسته گاوسی تطبیق تاریکی تعریف کنیم و آن را به تابع histeq دهیم. ابتدا ما باید مشخصات پارامترهای مورد نظر خویش از هیستوگرام ایدهآل خود را تعیین کنیم. این پارامترها شامل واریانس،میانگین و … است.
شاید برای شما این سوال پیش آید که فایده این کار که تصویر اصلی، یک هیستوگرام خاص را دنبال کند چیست؟ برخی مواقع ما می خواهیم یک شی خاص را در تصویر بیابیم و برای این کار نیاز به سطح روشنایی مشخصی در تصویر داریم. لذا از تابع تطبیق تاریکی کمک میگیریم. در ادامه کدهای مربوطه را مشاهده میکنید:
clc;
clear;
close all;
%%load image
img1=imread(‘pout.tif’);
npixel=numel(img1);
mu=180;
sigma=30
H=@(x) exp(-1/(2*sigma^2)*(x-mu).^2);
x=0:255;
hgram=H(x)
hgram=round(npixel*hgram/sum(hgram));
img2=histeq(img1,hgram);
figure;
subplot(2,2,1);
imshow(img1);
title(‘orginal image’);
subplot(2,2,2);
imshow(img2);
title(‘Result of histeq’);
subplot(2,2,3);
imhist(img1);
subplot(2,2,4);
imhist(img2);
خطوط اول برای پاک کردن پنجره کنسول، پاک کردن متغیرهای موجود در محیط کار و بستن همه پنجرههای شکلی استفاده میشود.
سپس تصویر اولیه با فرمت TIFF با استفاده از تابع `imread` خوانده میشود. سپس تعداد پیکسلهای تصویر با استفاده از تابع `numel` محاسبه میشود.
مقادیر میانگین (`mu`) و انحراف معیار (`sigma`) برای تابع هسته گاوسی تطبیق تاریکی تعیین میشوند.
تابع هسته گاوسی تطبیق تاریکی با استفاده از تابع مثلثی `H(x)` تعریف میشود و برای مقادیر `x` در بازه 0 تا 255 محاسبه میشود.
تابع هسته گاوسی تطبیق تاریکی با توجه به تعداد پیکسلهای تصویر (`npixel`) و با تقسیم مقادیر هسته بر مجموع آنها، نرمالیزه میشود.
تصویر اصلاح شده با استفاده از تابع `histeq` و تابع هسته گاوسی تطبیق تاریکی (`hgram`) به دست میآید. تابع `histeq` برای ایجاد توزیع هیستوگرام مساوی در تصویر استفاده میشود.
در این خطوط، تصاویر و هیستوگرامهای تصویر اصلی و تصویر اصلاح شده نمایش داده میشوند. تصویر اصلی در subplot شماره 1 نمایش داده میشود و تصویر اصلاح شده در subplot شماره 2 نمایش داده میشود. همچنین، هیستوگرام تصویر اصلی در subplot شماره 3 نمایش داده میشود و هیستوگرام تصویر اصلاح شده در subplot شماره 4 نمایش داده میشود.
دیدگاهتان را بنویسید