رسم هیستوگرام در متلب
این پست به رسم هیستوگرام در متلب اختصاص دارد. در این پست از آموزش متلب، ابتدا مفهوم هیستوگرام گفته خواهد شد. سپس نحوه رسم هیستوگرام یک تصویر در پایتون آموزش داده خواهد شد. رسم هیستوگرام نیز به دو روش انجام میشود. یک بار با استفاده از دستور imhist در متلب هیستوگرام تصویر را رسم میکنیم. بار دیگر کد هیستوگرام را از صفر تا 100 آموزش خواهیم داد. تمرکز ما در این پست بر هیستوگرام تصویر خواهد بود. با هوسم همراه باشید…
هیستوگرام چیست
هیستوگرام نمایشی تقریبی از دادههای عددی است. هیستوگرام برای اولین بار توسط Karl Pearson مطرح شد. قدم اول در ساختن هیستوگرام، تبدیل رنج مقادیر به bin-ها یا bucket است[منبع]. bin-ها بازههایی متوالی و غیرهمپوشان هستند. معمولا (نه همیشه) bin-ها بازههایی با اندازه یکسان هستند.
پس از تبدیل رنج مقادیر به bin-ها، باید تعداد مقادیری که در هر بازه وجود دارند شمرده شوند. به این ترتیب به ازای هر بازه یک عدد به دست میآید. به این شکل نمایشِ دادهها، هیستوگرام گفته میشود. اعداد به دست آمده را با یک نمودار میلهای میتوان نمایش داد. در بخش بعدی هیستوگرام در تصویر را بررسی خواهیم کرد…
هیستوگرام تصویر
همانطور که میدانید یک تصویر دیجیتال از مجموعهای از پیکسلها ساخته شده است. هر پیکسل یک مقدار دارد که نشاندهنده شدت روشنایی آن پیکسل است. اگر مقادیر شدت روشنایی در بازه 0 تا L-1 باشند، در این صورت هیستوگرام تصویر، تابع گسستهای به شکل زیر خواهد بود:
که در آن rk برابر با k-اُمین مقدار شدت روشنایی و nk تعداد پیکسلهای تصویر با شدت روشنایی rk است. اما اینهایی که گفتیم یعنی چه؟
-
هیستوگرام با مثال
شاید شما از آن دسته افرادی هستید که تعریف کتابی را نمیپسندید. بنابراین به بیان ساده و با مثال دوباره مفهوم هیستوگرام را خواهم گفت. فرض کنید تصویری به ابعاد 5 * 5 دارید که بازه شدت روشنایی آن از 0 تا 7 باشد!
شدت روشنایی و رنگ هر پیکسل در تصویر نمایش داده شده است. برای محاسبه هیستوگرام در این تصویر یک نمودار میکشیم و در محور افقی تمام بازهی شدت روشنایی را مینویسیم، یعنی 0 تا 7:
حالا تعداد پیکسلهایی که هر شدت روشنایی را دارند میشماریم. بعد از شمارش خواهیم داشت:
به نموداری که بدست آوردیم، هیستوگرام گفته میشود. واقعیت این است که ما تصویر 5*5 نداریم! این تصویر با چشم غیر مصلح قابل دیدن نیست! قطعا وقتی ابعاد تصویر بزرگ میشود، شمارش تعداد پیکسلها با شدت روشنایی مشخص، عقلانی نیست! از این رو دست به دامان متلب میشویم! در بخش بعدی نحوه رسم هیستوگرام در متلب را خواهید آموخت…
هیستوگرام در متلب
دو راه برای محاسبه هیستوگرام در متلب وجود دارد. یکی این که در متلب کدی بنویسیم که تعداد پیکسلها را برایمان بشمارد. راه دیگر این است که از دستورهای آماده متلب استفاده کنیم. بله، در متلب دستوری وجود دارد که میتواند هیستوگرام یک تصویر را محاسبه میکند. اول روش آسانتر را توضیح میدهیم. سپس خودمان کد محاسبه هیستوگرام را مینویسیم…
-
دستور imhist در متلب
برای رسم هیستوگرام در متلب یک دستور مخصوص وجود دارد و آن دستور imhist است. استفاده از دستور imhist در متلب بسیار ساده است. کافی است تصویر موردنظرمان را به آن بدهیم. اما چگونه؟ ابتدا باید تصویر را در متلب فراخوانی کنیم. برای این کار از دستور imread استفاده میکنیم. تصویری که فراخوانی کردیم را در متغیر image ذخیره میکنیم:
image = imread('./moon.jpg');
قبل از اجرای کد بالا ابتدا تصویر را دانلود و در مسیر m-File کپی کنید [لینک تصویر]. سپس متغیر image را به دستور imhist میدهیم:
imhist(image)
نتیجه اجرای دستور بالا، تصویر زیر است:
بله، این هیستوگرام تصویر است! به همین راحتی توانستیم هیستوگرام تصویر را رسم کنیم. این دستور هیچ خروجی ندارد؟ اگر همینطور خشک و خالی از آن استفاده کنیم خیر. اما در صورتی که به شکل زیر از آن استفاده کنیم دو خروجی خواهد داشت:
[counts,x] = imhist(image);
با اجرای دستور بالا هیچ نموداری رسم نمیشود. تنها مقادیر در دو متغیر counts و x ذخیره میشوند. x همان مقادیر شدت روشنایی و counts تعداد پیکسلها در هر شدت روشنایی است. اما داخل تابع imhist چه خبر است؟ در بخش بعدی میخواهیم کدی بنویسیم که عمل رسم هیستوگرام در متلب را انجام دهد…
-
کد هیستوگرام در متلب
در این بخش میخواهیم کدی بنویسیم که هیستوگرام یک تصویر سیاه و سفید را محاسبه کند. برای این کار ابتدا یک m-File بسازید.
-
خواندن تصویر
اولین کار خواندن تصویر است. البته قبل از آن clear، clc معروف را مینویسیم:
clear clc %% Load image img = imread('./moon.jpg');
خب بعد از خواندن تصویر، ابتدا آن را رسم میکنیم:
figure(1) imshow(img) title('Input Image')
- خط 1: یک پنجره برای رسم تصویر باز میکنیم.
- خط 2: تصویر را به وسیله imshow رسم میکنیم.
- خط 3: عنوان تصویر به وسیله title تعیین شده است.
-
رسم هیستوگرام
قدم بعدی بدست آوردن هیستوگرام است. برای این کار مینویسیم:
%% Histogram bin = 1:256; hist = zeros(1,256); for i = 0 : 255 counts = (img == i); hist(i+1) = sum(counts, [1, 2]); end
- خط 2: ابتدا تعداد bin-ها را مشخص میکنیم. تعداد bin-ها همان تعداد سطوح روشنایی است. که در تصویر موردنظر ما 256 سطح روشنایی وجود دارد. بنابراین bin-ها را اعداد 1 تا 256 در نظر میگیریم.
- خط 3: در این خط متغیری به نام hist میسازیم. مقدار متغیر hist را برابر با یک بردار صفر به طول bin-ها قرار میدهیم. یعنی یک بردار صفر به طول 256. بعدا این متغیر را با مقادیر درستِ هیستوگرام پُر خواهیم کرد.
- خط 4: با استفاده از for یک حلقه مینویسیم. اندیس این حلقه از 0 شروع شده و به 255 ختم میشود. چرا که ما باید بررسی کنیم که هر شدت روشنایی چند بار در تصویر تکرار شده است. مقادیر شدت روشنایی هم که 0 تا 255 بودند.
- خط 5: در این خط شدت روشناییهایی که برابر با i هستند استخراج میشوند. متغیر counts یک ماتریس هم اندازه با تصویر است. مقادیر این ماتریس در نواحی که شدت روشنایی برابر با i باشد، مقدارش 1 و در غیر اینصورت 0 است.
- خط 6: حالا مقادیر 1 در متغیر counts را میشماریم. این کار را با جمع کردن نیز میتوانیم انجام دهیم. سپس تعداد مقادیر 1 را در متغیر hist ذخیره میکنیم. اندیس hist را i+1 گذاشتیم زیرا مقدار i از صفر شروع میشود ولی در متلب اندیسها از یک شروع میشوند!
- خط 7: این خط هم که واضح است!
بعد از محاسبه هیستوگرام، نوبت به نمایش آن است. برای این کار باید همه مقادیری که در متغیر hist ذخیره کردیم را به وسیله یک نمودار میلهای نمایش دهیم:
%% Show Result figure(2) bar(bin, hist) ylabel('No. of pixels with such intensity levels') xlabel('Intensity levels'), xlim([0 255]) title('HISTOGRAM OF THE IMAGE', 'fontsize', 14)
- خط 2: در این خط یک پنجره جدید برای رسم هیستوگرام باز میکنیم.
- خط 3: در این خط رسم هیستوگرام در متلب به وسیله دستور bar انجام میشود. اگر با دستور bar در متلب آشنایی ندارید به پست «نمودار میلهای در متلب» مراجعه کنید.
- خط 4، 5 و 6: در این سه خط عنوانی برای محور عمودی، محور افقی و عنوانی برای کل تصویر انتخاب شده است.
با Run کردن m-File، دو تصویر خواهیم داشت:
تصویر اول، تصویر ورودی و تصویر دوم، هیستوگرام تصویر ورودی است. تا اینجا هیستوگرام را برای یک تصویر سطح خاکستری رسم کردیم. اما رسم هیستوگرام در متلب برای تصاویر RGB چگونه است؟
هیستوگرام تصویر رنگی در متلب
تا اینجا توانستیم هیستوگرام یک تصویر سطح خاکستری را رسم کنیم. اما برای رسم هیستوگرام در متلب برای تصاویر رنگی چکار کنیم؟ میدانید که تصاویر رنگی شامل سه صفحه هستند. هرکدام از صفحات مربوط به یکی از رنگهای سبز، قرمز و آبی است.
برای رسم هیستوگرامِ یک تصویر RGB میتوان هیستوگرام را برای هرکدام از صفحات به صورت جداگانه محاسبه و رسم کرد. در این صورت هر هیستوگرام حاوی اطلاعاتی در مورد شدت هر رنگ (قرمز، سبز و آبی) در تصویر خواهد بود. محاسبه هیستوگرام هم مانند بخش قبل انجام میشود.
clear clc %% Load image img = imread('./ocean.jpg'); imshow(img) title('Input Image') %% Histogram [r_hist, x1] = imhist(img(:, :, 1)); [g_hist, x2] = imhist(img(:, :, 2)); [b_hist, x3] = imhist(img(:, :, 3)); %% Show Result figure() subplot(3, 1, 1) bar(x1, r_hist) title('HISTOGRAM OF THE RED PLANE', 'fontsize', 12) subplot(3, 1, 2) bar(x2, g_hist) title('HISTOGRAM OF THE GREEN PLANE', 'fontsize', 12) subplot(3, 1, 3) bar(x3, b_hist) title('HISTOGRAM OF THE BLUE PLANE', 'fontsize', 12)
دیگر این کدها را توضیح نخواهیم داد، زیرا مشابه حالت قبل است. نتیجه اجرای کد بالا به شکل زیر است:
-
تحلیل هیستوگرامِ تصویر رنگی
اگر تصویر اصلی را نداشتیم میتوانستید حدس بزنید چه رنگهایی در تصویر وجود دارد؟؟ به هیستوگرام صفحه قرمز دقت کنید. رنگ قرمز در این تصویر بسیااااار کم است. هیستوگرام رنگ سبز و آبی میگویند که در این تصویر بیشتر رنگ آبی و سبز وجود دارند. همچنین غلظت رنگ آبی بیشتر است. بدین ترتیب توانستیم هیستوگرام یک تصویر رنگی را رسم کنیم. در فضاهای رنگی غیر از RGB نیز به همین ترتیب میتوان هیستوگرام را رسم کرد.
دانلود کدها
جمعبندی
در این پست نحوه رسم هیستوگرام در متلب را آموزش دادیم. ابتدا مفهوم هیستوگرام را بررسی کردیم. سپس هیستوگرام را برای تصویر سطح خاکستری و رنگی در متلب رسم کردیم. امیدوارم این آموزش مورد توجه شما قرار گرفته باشد. سوالاتتان را در کامنت بپرسید. در اسرع وقت به سوالهایتان پاسخ داده خواهد شد.
برای مشاهده لینک دانلود لطفا وارد حساب کاربری خود شوید!
وارد شویدپسورد فایل : گزارش خرابی لینک
مطالب زیر را حتما مطالعه کنید
تعریف متغیر در متلب
آموزش متلب رایگان
دستور max در متلب
دستور محاسبه انتگرال در متلب
دستور input در متلب
دستور ezplot در متلب
4 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
خسته نباشید.روشی برای هیستوگرام تصاویر رنگی بدون اینکه هرلایه را جدا رسم کنیم وجود داره؟
سلام چرا نمودار من فقط صفحه خالیه :(((
سلام،
کدهای این جلسه برای دانلود گذاشته شده، میتونید دانلودشون کنید، شاید کمکتون کنه.
سلام وقت بخیر..من این کد رو زدم ولی توی قسمت رسم هیستوگرام برام خطا میزنه علتشو نمیدونم چیه