خواندن و نوشتن تصاوير در مطلب

خواندن و نوشتن تصاوير در مطلب

براي كسب اطلاعات در مورد يك فايل تصويري ذخير شده در حافظه كامپيوتر از دستور imfinfo استفاده كنيد. براي ديدن ليست قالب‌هاي تصويري مورد پشتيباني در متلب، در پنجره فرمان imformats را وارد کنید.

مثالي از خواندن يك فايل تصويري:

RGB = imread('football.jpg');

برخي قالب‌هاي تصويري مانند jpg براي هر پيكسل 8 بيت تخصيص مي‌دهند. بنابراين، متلب اين نوع تصاوير را به صورت نوع uint8 نمايش مي‌دهد. اما برخي قالب‌هاي تصويري مانند PNG وTIFF مي‌توانند براي هر پيكسل 16 بيت تخصيص دهند، بنابراين دستور imread باعث توليد آرايه‌اي از نوع uint16 مي‌گردد.

براي خواندن يك تصوير به صورت يك تصوير انديس گذاري شده، متلب از دو متغير يكي براي ماتريس رنگ و ديگري براي ماتريس اشاره‌گرها. دستور imread همواره اطلاعات ماتريس رنگ را در ماتريسي از نوع double قرار مي‌دهد گرچه ماتريس اشاره‌گرها خود از نوع uint8 و یا uint16 است.

مثالي از خواندن يك تصوير به صورت يك تصوير انديس‌گذاري شده:

[X,map] = imread('trees.tif');

برخي قالب‌هاي تصويري مانند tiff قادر به ذخيره بيش از يك تصوير در خود هستند. در اين‌گونه مواقع، دستورimread به طور پيش فرض اولين تصوير (يا فريم) را مي‌خواند مگر اينكه از قالب دستورالعمل مناسب براي خواندن بقيه‌ي فريم‌ها استفاده كنيم.در مثال زير، 27 تصوير از يك فايل با قالب tiff خوانده شده و در يك آرايه چهار بعدي قرار داده مي‌شوند. البته جلوتر مي‌توانيد از دستور imfinfo كمك بگيريد تا ببينيد چند فريم در فايل ذخيره شده است.

mri = zeros([128 128 1 27],'uint8'); for frame=1:27% preallocate 4‐D array [mri(:,:,:,frame),map] = imread('mri.tif',frame); end

اگر مي‌خواهيد فايل بزرگي را بخوانيد براي اينكه مشكل كمبود حافظه پيش نيايد، يك راه اين است كه از پردازش بلوكي استفاده كنيد.

برا ذخيره داده‌هاي يك تصوير به صورت يك فايل تصويري روي حافظه كامپيوتر از دستور imwrite مي‌توانيد استفاده كنيد. در مثال زير ابتدا يك تصوير انديس گذاري شده كه در فايلي با قالب mat. ذخيره شده است خوانده شده و به فضاي كاري متلب منتقل مي‌شد. سپس اين تصوير به صورت يك فايل تصويري با قالب .bmp در حافظه كامپيوتر ذخيره مي‌شود.

>>load clown >>whos Name Size Bytes Class X 200x320 512000 double array caption 2x1 4 char array map 81x3 1944 double array Grand total is 64245 elements using 513948 bytes >>imwrite(X,map,'clown.bmp')

برخي قالب‌هاي تصويري يك سري پارامترهاي خاص خود دارند كه در دستور imwrite مي‌توانيد آنها راتعيين كنيد. براي ديدن اين پارامترهاي خاص بايد از دستور imwrite در محيط راهنماي متلب (کلید F1) راهنما بگیرید.(در اينجا دستورhelp كمك چنداني نمي‌كند).

برای مثال:

imwrite(I,'clown.png','BitDepth',4); imwrite(A, 'myfile.jpg', 'Quality', 100);

تمرين: حتماً به راهنماي مذكور مراجعه كنيد و چند قالب تصويري و پارامترهايشان را بررسي كنيد.

برخي قالب‌ها مانند tiff به شما اجازه مي‌دهند كه تصويرتان را به صورت 1 بيت بر پيكسل (1bpp) ذخيره كنيد. در اين حالت اصطلاحاً گفته مي‌شود عمق بيت برابر 1 بيت است. بنابراين كاملاً مناسب ذخيره تصاوير باينري است. از طرف ديگر، اگر چنين تصاوير ذخيره شده‌اي را با دستور imread بخوانيد، ماتريسي از نوع logical (در فضای کاری متلب) خواهيد داشت.

مثال زير يك تصوير باينري (با قالب png)را خوانده و آن را به صورت قالب tiff ذخيره مي‌كند:

>>BW = imread('text.png'); >>imwrite(BW,'test.tif');

در مثال فوق اگر مي‌خواهيد مطمئن شويد كه تصوير مورد بررسي به صورت 1 بيت بر پيكسل است، از دستور imfinfo كمك گرفته و ميدانِ BitDepthرا بررسي كنيد:

>>info = imfinfo('test.tif'); >>info.BitDepth ans =1

خواندن تصاوير با محدوده ديناميكي زياد

تصاوير با محدوده ديناميكي زياد معمولاً در فايل‌هايي با پسوند hdr ذخيره مي‌شوند. براي خواندن اين فايل‌ها از دستور hdrread استفاده كنيد. براي مثال:

>>hdr_image = hdrread('office.hdr');

>>whos Name: hdr_image Size:665x1000x3 Bytes:7980000 Class: single Attributes>

براي نمايش يك تصوير با محدوده ديناميكي زياد بايد ابتدا آن را متناسب با محدوده ديناميكي مانيتور تغيير دهيد (اصلاح كنيد). به اين فرآيند تصحيح، نگاشت تن اطلاق مي‌شود. اگر به سادگي (بدون انجام تصحيح مذكور)، از imshow براي نمايش اين گونه تصاوير استفاده كنيد، نمايش مناسبي به دست نمي‌آوريد:

>>imshow(hdr_image);

براي انجام نگاشت تن، از تابع tonemap استفاده كنيد:

>>rgb = tonemap(hdr_image);

حال مي‌توانيد از دستور imshow استفاده كنيد:

>>imshow(rgb);

براي ذخيره يك تصوير با محدوده ديناميكي زياد روي حافظه كامپيوتر با قالب hdr مي‌توانيد از دستور hdrwrite استفاده كنيد:

hdrwrite(hdr,'filename');



نظرات کاربران



عبارت امنیتی : حاصل 4 × 1 می شود :
متن پیام :