دستورات پردازش تصویر در متلب
بهنام خدا، سلام… در این پست طولانی سعی میکنیم به تدریج تمامی توابع موجود در تولباکس پردازش تصویر متلب را به صورت دستهبندی شده به فارسی توضیح دهیم. و حتیالامکان یک نمونه مثال هم از هردستور بیاوریم. در وقع هدف ما این است که یک دیکشنری یا هندبوک از دستورات پردازش تصویر در متلب برای شما بسازیم. فهرست دستورات پردازش تصویر در متلب که در این پست توضیح دادهایم در زیر آمده است. روی دستور مدنظرتان کلیک کنید تا دقیقا به توضیحات همان دستور منتقل شوید.
دستور imread در متلب
از این دستور برای فراخوانی تصویر در متلب با فرمتهای مختلف مانند jpg ، png ، bmp ، tif و غیره استفاده میشود. نحوه استفاده از این دستور بسیار ساده است. کافی است، آدرس تصویر موردنظرتان که در هارد کامپیوتر ذخیره شده را به دستور imread بدهید. بیایید بدون توضیحات اضافه، یک نمونه مثال ببینیم:
img = imread('E:\Howsam\howsam_logo.jpg');
در دستور بالا مشاهده میکنید که تنها کافی است در داخل پرانتز دو علامت ‘ ‘ گذاشته شود و سپس داخل این علامتها آدرس تصویر مورد نظر خودتان را بنویسید. تصویر شما میتواند در هرکجا از فضای هاردتان و در هر درایو دلخواهی باشد و تنها کافی است که آدرس تصویر را به صورت کامل مانند کد بالا به دستور imread در متلب بدهید. مثلا در دستور بالا، تصویری بنام howsam_logo.jpg را فراخوانی کردیم. این تصویر در درایو E و پوشه Howsam قرار دارد.
دستور imshow در متلب
دستور imshow در متلب برای نمایش تصویر در متلب بهکار میرود. نحوه استفاده از این دستور، بسیار ساده است. کافی است نام متغیر تصویر را بهعنوان ورودی به دستور imshow در متلب بدهید. برای نمونه، در دستور زیر یک نمونه تصویر با imread فراخوانی شده است. این تصویر در متغیر I ذخیره شده است. برای نمایش تصویر کافی است I را بهعنوان ورودی به imshow بدهید:
I = imread('peppers.png'); imshow(I)
دستور imwrite در متلب
از دستور imwrite در متلب برای ذخیره یک تصویر در هارد استفاده میشود. با استفاده از این دستور شما میتوانید تصویر مدنظر خودتان در برنامه MATLAB را در هرجایی از هارد خود ذخیره کنید. سپس، میتوانید از تصویر ذخیرهشده در نرمافزارهای دیگری مانند ورد، پاورپوینت و غیره استفاده کنید. نحوه استفاده از این دستور هم بسیار ساده هست؛ این دستور به دو ورودی نیاز دارد:
- ورودی اول: نام تصویری که میخواهید ذخیره کنید (نام متغیر)
- ورودی دوم: آدرس جایی که میخواهید تصویر در آن ذخیره شود. همچنین، نام تصویر و نوع فرمت تصویر ذخیره شده را هم باید تعیین کنید.
در کد زیر به MATLAB دستور داده شده که ماتریس I را در محلی بنام درایو E و پوشهای بنام howsam با نام salam و فرمت تصویر png ذخیره کند. توجه کنید که آدرسها باید در علامتهای ‘ ‘ قرار داشته باشند.
I = imread('peppers.png'); imwrite(I,'E:\howsam\salam.png')
دستور imfinfo در متلب
با استفاده از دستور imfinfo در متلب مجموعهای از اطلاعات و ویژگیهای تصویر در اختیار شما قرار میگیرد. این اطلاعات شامل اندازه تصویر (طول و عرض تصویر)، حجم تصویر، نحوه کدینگ تصویر، مسیر تصویر در هارد و غیره هست. آدرس تصویر مدنظرتان را بهعنوان ورودی به دستور imfinfo در متلب بدهید. مانند کد زیر:
info = imfinfo('ngc6543a.jpg')
و اما خروجی دستور بالا:
info =
Filename: 'matlabroot\toolbox\matlab\demos\ngc6543a.jpg'
FileModDate: '01-Oct-1996 16:19:44'
FileSize: 27387
Format: 'jpg'
FormatVersion: ''
Width: 600
Height: 650
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: ''
NumberOfSamples: 3
CodingMethod: 'Huffman'
CodingProcess: 'Sequential'
Comment: {'CREATOR: XV Version 3.00b Rev: 6/15/94 Quality = 75, Smoothing = 0'}
دستور image در متلب
از دستور image در متلب برای نمایش یک تصویر استفاده میشود. همچنین، این دستور میتواند یک ماتریس را به صورت تصویر نمایش بده. به عنوان مثال، ماتریس زیر را در نظر بگیرید که با استفاده از دستور image به شکل یک تصویر نمایش داده شده است. با دستور colorbar یک میله رنگی در کنار تصویر نشون داده میشود. میتونید این میله مستطیلی را در تصویر زیر ببینید:
C = [0 2 4 6; 8 10 12 14; 16 18 20 22]; image(C) colorbar
دستور hdrread در متلب
تصاویر hdr مخفف تصاویر high dynamic range هستند. این تصاویر شامل دستورات جداگانهای برای فراخوانی در متلب هستند. دستور hdrread در متلب برای فراخوانی تصویر hdr در متلب استفاده میشود. تصاویر hdr، تصاویر RGB هستند و از همه مهمتر بازه تغییر اعداد آنها [inf 0] هست. درحالیکه در تصاویر معمولی بازه اعداد [255 0] هست. این مساله نشان میدهد که ما با تصاویری سر و کار داریم که میزان رنگ بیشتری در آنها وجود داره. نحوه نمایش این تصاویر هم کمی متفاوت با نمایش تصاویر معمولی هست. پس از خواندن تصویر hdr مطابق کدهای زیر باید با استفاده از دستور tonemap تصویر hdr را برای نمایش رندر (render) کرد و سپس از دستور imshow برای نمایش تصویر استفاده نمود. یک نمونه مثال ببینید:
hdr = hdrread('office.hdr'); rgb = tonemap(hdr); imshow(rgb)
دستور hdrwrite در متلب
از دستور hdrwrite در متلب برای ذخیره تصاویر hdr استفاده میشود. نحوه استفاده از این دستور دقیقا شبیه دستور imwrite هست و هیچ تفاوتی با هم ندارند. یعنی کافی است، نام تصویر موردنظر برای ذخیره و همچنین آدرس محل ذخیره را به دستور hdrwrite بدهید. مانند مثال زیر:
hdr = hdrread('office.hdr'); hdrwrite(hdr,'E:\howsam\hdr.png')
دستور gray2ind در متلب
دستور gray2ind در متلب، تصویر سطح خاکستری را به یک تصویر ایندکس شده تبدیل میکند. همانطور که در کدهای زیر هم میبینید، این دستور دو ورودی دارد که یکی تصویر ورودی هست که باید یا تصویر سطح خاکستری یا سیاه-سفید باشد. ورودی دوم هم اندازه colormap یا همان تعداد سطوح رنگی است. مثلا کد زیر را ببینید:
I = imread('cameraman.tif'); n = 4; [X, map] = gray2ind(I, n); imshow(X, map);
کد بالا را دوبار با مقادیر n متفاوت اجرا کنید. تصویر زیر خروجی دو مقدار متفاوت برای n هست. ببینید وقتیکه مقدار n را از عدد 4 به عدد 16 تغییر میدهیم چه اتفاقی میافتد… تعداد سطوح خاکستری بیشتر میشود و بنابراین تصویر ایندکس شده هم به تصویر اصلی نزدیکتر میشود.
تصویر سمت راست: تصویری با چهار ایندکس، تصویر سمت چپ: تصویری با شانزده ایندکس.
دستور ind2gray در متلب
دستور ind2gray برعکس دستور قبلی هست. این دستور دو ورودی دارد و مطابق کدهای زیر، متغیر اول یک تصویر و متغیر دوم colormap هست. به عنوان مثال کدهای زیر رو ببینید:
load trees I = ind2gray(X,map); imshow(X,map) figure,imshow(I)
در کد بالا، اگر بخواهیم تصویر را به صورت ایندکسشده نشان دهیم تصویر، تصویر سمت چپ حاصل میشود. اگر با استفاده از دستور ind2gray به تصویر سطح خاکستری تبدیلش کنیم، تصویر سمت راست بهدست میآید.
دستور mat2gray در متلب
دستور mat2gray در متلب برای تبدیل ماتریسها به تصاویر سطح خاکستری استفاده میشود. بازه اعداد در تصویر سطح خاکستری خروجی [1 0] هست. نحوه استفاده از این دستور به صورت زیر هست:
J = mat2gray(I);
دستور rgb2gray در متلب
دستور rgb2gray در متلب، یکی از متداولترین دستورات پردازش تصویر در متلب هست. این دستور کار تبدیل تصویر رنگی به تصویر سطح خاکستری را انجام میدهد. نحوه استفاده از این دستور هم بسیار ساده هست. تصویر رنگی را بهعنوان ورودی میدهید و در خروجی تصویر سطح خاکستری دریافت میکنید. به کدهای زیر توجه کنید:
RGB = imread('peppers.png'); imshow(RGB) I = rgb2gray(RGB); figure, imshow(I)
دستور im2double در متلب
دستور im2double در متلب، تصویر را به یک تصویر از نوع دابل (double) تبدیل میکند. این دستور در پردازش تصویر بسیار پرکاربرد است. تصاویری که با استفاده از دستور imread در متلب فراخوانی میشوند، از نوع uint8 هستند. با استفاده از دستور im2double عمل تبدیل به double را بهراحتی میتوان انجام داد. نحوه استفاده از این دستور هم به صورت زیر هست:
J = im2double(I);
دستور im2uint8 در متلب
دستور im2uint8 در متلب بسیار پرکاربرد است. این دستور، یک ماتریس یا تصویر را به نوع uint8 تبدیل میکند. تبدیل تصویر به یک تصویر از نوع صحیح بدون علامت 8 بیتی (unsigned integer). در نوشتههای بالا گفتیم که تصاویر فراخوانیشده در متلب از نوع uint8 هست. معمولا بعد از وارد کردن تصویر در متلب، تصویر با استفاده از im2double به یک تصویر نوع دابل تبدیل میشود. سپس کارهای پردازش تصویری روی آن انجام میشود. اصولا بسیاری از دستورات پردازش تصویر در متلب روی تصاویر دابل اعمال میشوند. وگرنه ممکن است خروجی با خروجی موردانتظار شما متفاوت باشد. اما درنهایت برای ذخیره و سایر کارها نیاز است که دوباره تصویر به uint8 تبدیل شود. برای این تبدیل میتوان از دستور im2uint8 در متلب بهره برد. نحوه استفاده از آن هم که بسیار ساده است و در زیر آورده شده است:
J = im2uint8(I);
دستور im2single در متلب
در بالا گفتیم که دستور im2double در متلب تصویر را به یک تصویر نوع دابل تبدیل میکند. دابل یا double یعنی اعداد اعشاری 64 بیتی… برای استفاده از اعداد اعشاری 32 بیتی، کافی است از single استفاده کنید (signle-precision). اگر میخواهید تصویر شما برمبنای اعداد اعشاری 32 بیتی باشد، کافی است از دستور im2single در متلب استفاده کنید. یک نمونه مثال ساده هم از این تبدیل در ادامه مشاهده میکنید:
J = im2single(I);
دستور im2int16 در متلب
برای ما کمتر پیشآمده که بخواهیم از دستور im2int16 در متلب استفاده کنیم. شاید در الگوریتمهایی مانند Local Binary Pattern همان LBP کاربرد داشته باشد. تبدیل تصویر به یک تصویر از نوع صحیح علامتدار 16 بیتی (sigend integer). نحوه استفاده از این دستور هم به صورت دستور بالاست. کافی است بنویسید:
J = im2int16(I);
دستور im2uint16 در متلب
با استفاده از دستور im2uint16، تصویر به یک تصویر صحیح 16 بیتی بدون علامت تبدیل خواهد شد (unsigned integer). در بالا، به دو دستور im2int16 و im2uint8 که برای تبدیل تصویر به اعداد صحیح هستند، صحبت کردیم. یک نمونه مثال در ادامه ببینید:
J = im2uint16(I);
دستور im2java2d در متلب
تبدیل تصویر به تصویر از نوع جاوا که فرمت مخصوص به خود را دارد. به عنوان نمونه، در دستورات زیر تصویر به تصویر نوع جاوا تبدیل شده و سپس در قالب جاوا به نمایش تصویر پرداخته شده است. لازم به ذکر است که بعضی از دستورات جاوا در متلب قابل اجراست.
I = imread('moon.tif'); javaImage = im2java2d(I); frame = javax.swing.JFrame; icon = javax.swing.ImageIcon(javaImage); label = javax.swing.JLabel(icon); frame.getContentPane.add(label); frame.pack frame.show
دستور checkerboard در متلب
دستور checkerboard در متلب، یک تصویر مصنوعی شطرنجی میسازد. تصویر ساختهشده یک تصویر شطرنجی 8×8 است. به عنوان ورودی میتوان تعیین کرد که طول ضلع هر مربع چند پیکسل باشد. به عنوان نمونه، با کد زیر یک تصویر شطرنجی به ابعاد 8×8 ساخته میشود که طول هر مربع 20 پیکسل است.
I = checkerboard(20); imshow(I)
دستور phantom در متلب
دستور phantom در متلب، یک تصویر مصنوعی از مغز انسان میسازد. شبیه تصاویر MRI از مغز که احتمالا دیدهاید. دو ورودی دارد:
- ورودی اول، مدل تصویر را مشخص میکند. شامل دو حالت ‘Shepp-Logan’ و ‘Modified Shepp-Logan’ است. مورد اول، بیشتر توسط محققان توموگرافی استفاده میشود.
- ورودی دوم، اندازه تصویر ساختهشده را تعیین میکند.
P = phantom('Modified Shepp-Logan', 200); imshow(P)
دستور imnoise در متلب
دستور imnoise در متلب یکی از دستورات پرکاربرد در پردازش تصویر است. با استفاده از این دستور میتوان نویزهای مختلفی به تصویر اضافه کرد. در دستور imnoise در متلب، 5 نوع نویز gaussian، localvar، salt & pepper، poisson و speckle وجود دارد. در ادامه درمورد هریک از نویزها توضیح داده شده است:
- نویز gaussian: نویز گوسین در تصویر ایجاد میکند. برای استفاده از این نوع نویز باید به عنوان ورودی، مقدار انحراف معیار و میانگین نویز تعیین شود. نحوه استفاده از این دستور به شکل زیر هست:
I = imread('eight.tif'); imshow(I) J = imnoise(I, 'gaussian', 0.1, 0.02); imshow(J)
در کد بالا، در دستور imnoise ورودی اول، تصویر هست. ورودی دوم مشخص میکند که ما میخواهیم نویز گوسین در تصویر داشته باشیم. ورودی سوم، مقدار میانگین نویز گوسین را تعیین میکند. مقدار پیشفرض میانگین در نویز گوسین برابر با 0 هست. ورودی چهارم، مقدار انحراف معیار در نویز گوسین را مشخص میکند. مقدار پیشفرض انحراف برابر با 0.01 است.
- نویز salt & pepper: نویز salt & pepper همان نویز فلفل نمک است. همان نویزی که در تصویر یکسری پیکسلهای سفید و سیاه رنگ ایجاد میکند. این نویز هم یک پارامتر تنطیم بنام شدت نویز دارد که میزان نویز در تصویر را تعیین میکند. یک نمونه مثال ببینید:
J = imnoise(I,'salt & pepper',0.02); imshow(J)
- نویز poisson: نویز poisson در تصویر ایجا میکند. این حالت، پارامتر تنظیمی هم ندارد و هیچ پارامتری نیست که با آن میزان این نوع نویز را بتوان کم یا زیاد کرد.
J = imnoise(I, 'poisson');
- نویز speckle: در این حالت نویز speckle یا نویز ضربی به تصویر اضافه میشود. این نوع نویز میانگین صفر دارد ولی واریانس را به عنوان یک پارامتر ورودی میتوان تنظیم کرد.
J = imnoise(I, 'speckle', 0.02);
دستور montage در متلب
دستور montage در متلب برای نمایش دستهجمعی تصاویر بهکار میبرد. کاربرد جالبی دارد و ازجمله دستورات پردازش تصویر در متلب هست که باوجود مفید بودن، از آن کم استفاده میشود. اما این دستور دقیقا چه کاری انجام میدهد؟ تصور کنید که شما یک پوشه دارید که شامل 10 تصویر هست. حالا میخواهید این 10 تا تصویر را با هم مقایسه کنید. بهتر هست برای مقایسه، همه تصاویر را همزمان و کنار هم ببینید. این کاری است که دستور montage در متلب برای شما انجام میدهد. به کدهای زیر نگاه کنید. ابتدا یک پوشه شامل تصاویر انتخاب شده و بعد اسامی این تصاویر در یک متغیری بنام filenames قرار داده شده و بعد این متغیر به عنوان ورودی به دستور montage داده شده است.
fileFolder = fullfile(matlabroot,'toolbox','images','imdata'); dirOutput = dir(fullfile(fileFolder,'AT3_1m4_*.tif')); fileNames = string({dirOutput.name}); fileNames = 1×10 string array Columns 1 through 7 "AT3_1m4_01.tif" "AT3_1m4_02.tif" "AT3_1m4_03.tif" "AT3_1m4_04.tif" "AT3_1m4_05.tif" "AT3_1m4_06.tif" "AT3_1m4_07.tif" Columns 8 through 10 "AT3_1m4_08.tif" "AT3_1m4_09.tif" "AT3_1m4_10.tif" montage(fileNames, 'Size', [2 5]);
* subimage
چند تصویر رو یکجا و در یک شکل نشون میده. معمولا از این دستور آنچنان استفاده نمیشه. نحوه استفاده از این دستور بسیار ساده هست و میتونید در کدهای زیر بینید.
* immovie
این دستور برای ساخت یک ویدیو استفاده میشه. این دستور به عنوان ورودی به یک ماتریس نیاز داره که باید شامل فریمها و یا مجموعه تصاویری که میخواییم به شکل ویدیو نشونش بدیم. این ماتریس باید به شکل m×n×1×k باشه. یعنی k تا تصویر یا فریم داریم که سایز هرکدومشون m×n هست. در کدهای زیر یک فایل بنام mri خونده شده که شامل 27 فریم با ابعاد 128×128 هست. برای نمایش ویدیو هم میشه از دستور implay استفاده کرد.
* implay
همانطور که در دستور قبلی مشاهده کردید، از این دستور برای نمایش یک ویدیو استفاده میشه. پس از اجرا، پنجرهای باز میشه که شامل ابزارهایی هم برای نمایش ویدیو هست.
* warp
این دستور در زمینه سه بعدی کاربرد زیادی داره. با استفاده از این دستور میتونیم یک بافت (texture) رو روی یک منحنی دلخواه قرار بدیم. مثلا در پروژههای سه بعدی سازی، ابتدا از طریق روشهای مختلف شکل سهبعدی شی مورد نظر ساخته میشه و بعد با استفاده از این دستور میشه بافت اون شی رو، روش شکل سه بعدی قرار داد.
2-2 نرمافزار نمایش تصویر
* imtool
با استفاده از این دستور پنجرهای برای نمایش تصویر باز میشه که شامل تعدادی ابزار هست. از جمله ابزارها میتونیم به فاصله بین دو پیکسل را اندازه بگیریم یا تصویر رو ببریم و … . نحوه استفاده از این دستور هم به صورت زیر هست:
imtool('board.tif')
لازم به ذکره که میشه بجای آدرس تصویر، متغیر تصویر رو هم بکار ببریم. مثلا تصویر رو با استفاده از دستور imread فراخونی کردیم و در متغیری بنام I ریختیم. حالا میتونیم بنویسیم:
I = imread('cameraman.tif');
imtool(I)
* imageinfo
پنجرهای باز میشه و همانند دستور imfinfo اطلاعاتی در مورد تصویر در اختیار قرار میده. البته این دستور اطلاعات بیشتری در اختیارمون قرار میده. نحوه استفاده از این دستور هم خیلی ساده هست.
imageinfo('peppers.png')
* imcontrast
پنجرهای باز میشه که از طریق اون میتونیم کنتراست در تصویر رو تغییر بدیم. نحوه استفاده از این دستور هم بسیار آسون هست. به مثال زیر دقت کنید:
imshow('pout.tif')
imcontrast
* imdisplayrange
همونطور که میدونید بازه اعداد در تصاویر معمولا بین 0 تا 255 هست. اما تصاویر با فرمتهای مختلفی هم هستند که بازه اعدادشون متفاوته. با استفاده از این دستور موقعیکه تصویر رو نمایش میدیم، یه عبارتی در گوشه پایین سمت راست تصویر نوشته میشه که نشون میده بازه اعداد در تصویر چقدر هست.
imshow('bag.png');
imdisplayrange;
* imdistline
با استفاده از این دستور میتونیم فاصله بین دو پیکسل رو اندازه بگیریم. یعنی بعد از این دستور پنجرهای باز میشه که به شما این امکان رو میده پیکسلهای مد نظرتون رو روی تصویر علامتگذاری کنید و بعد فاصله بین دو تا پیکسل رو اندازهگیری میکنه.
imshow('pout.tif');
h = imdistline
* impixelinfo
این دستور معمولا بعد از دستور imshow نوشته میشه. اطلاعاتی در مورد هر پیکسل میده. یعنی اگه به تصویر زیر دقت کنید، میبینید جاییکه ماوس قرار گرفته اطلاعاتی از اون پیکسل شامل مختصات و همچنین شدت رنگش در اختیار ما قرار میده که میتونه خیلی مفید باشه.
* impixelregion
مقدار پیکسلهای در یک ناحیه از تصویر را مطابق شکل نشان میده. مطابق بسیاری از دستورات این بخش، استفاده از این دستور نیز بسیار آسونه.
*
دیدگاهتان را بنویسید