آستانه گیری، تحلیل و مدیریت تصاویر در مطلب

آستانه گیری، تحلیل و مدیریت تصاویر در مطلب

مثال 1 – خواندن و ذخيره تصوير

خواندن تصوير

بهتر است ابتدا متغيرهاي فضاي كاري را پاك كنيد:

clear all;

و همچنين پنجره‌هايي كه تاكنون باز مانده اند را نيز ببنديد:

close all;

حال تصوير مورد نظر را به كمك دستور imread خوانده و در آرايه‌اي به نام I قرار مي‌دهيم:

I = imread('pout.tif');

براي ديدن ليستي از فايل‌هاي مورد پشتيباني در MATLAB (از جمله فايل‌هاي تصويري) دستور زير را وارد کنید:

>>help fileformats

حال مي‌توانيد تصوير خوانده شده را نمايش دهيد. براي اين كار دو تابع متداول است يكي imshow و دیگری imtool كه البته غالباً از اولي استفاده مي‌شود زيرا فقط كار نمايش را انجام مي‌دهد اما دومي علاوه بر نمايش اطلاعات بيشتري در اختيار قرار داده و حتي مي‌توانيم به كمك آن برخي پردازش‌ها را نيز انجام دهيم.

استفاده از دستور imshow:

imshow (I)

كسب اطلاعات در مورد نحوه تغيير فضاي كاري

به پنجره فضاي كاري (workspace) خود نگاه كنيد و ببينيد كه در اثر اجراي دستور خواندن تصوير، چه متغيري به فضاي كاري اضافه شده است. البته مي‌توانيد از دستور whos نيز در پنجره فرمان استفاده كنيد:

>>whos

در MATLAB تصاوير به صورت (يا نوعِ)double و ،uint16 ،uint8 قابل ذخيره مي‌باشند.

بهبود تبيان (يا كانتراست ) تصوير

تعريف كانتراست؟ كانتراست تصوير مورد بررسي در اين مثال كم (يا پايين) است. براي بررسي صحت اين جمله به صورت علمي بايد هيستوگرام تصوير مذكور را بررسي كرد.

تعريف هيستوگرام؟

براي نمايش نحوه ي توزيع شدت روشنايي (يا همان هيستوگرام) يك تصوير مي‌توان از دستورimhist استفاده كرد. ابتدا از دستورfigure براي ايجاد يك پنجره جديد استفاده مي‌كنيم (چرا؟).

>>figure

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

>>imhist(I)

حال، به كمك شكل فوق، محدوده تغييرات شدت روشنايي (يا محدوده ديناميكي ) را ارزيابي كنيد و براي خود استدلال كنيد كه چرا كانتراست تصوير I پايين است.

چرا به دنبال افزايش كانتراست بايد بود؟

براي افزايش كانتراست تصوير در MATLAB راه‌هاي مختلفي وجود دارد از جمله استفاده از دستور histeq كه از فرآيند تعديل سازي هيستوگرام استفاده مي‌كند. نتيجه اجراي اين فرآيند را در تصوير ديگري مانندI2 ذخيره مي‌كنيم:

I2 = histeq(I);

حال نتيجه را در پنجره جديدي نمايش مي‌دهيم:

figure, imshow(I2)

حال براي اينكه اثر دستور histeq را روي هيستوگرام تصوير I ببینید،مجددا از دستور imhist استفاده کنید.

figure, imhist(I2)

(روي تصوير فوق فكر و استدلال كنيد)

برخي ديگر امكانات موجود در متلب براي افزايش كانتراست يك تصوير عبارتند از:

1- دستورimadjust

2- دستور adapthisteq

3-استفاده از يك ابزار تعاملي به كمك استفاده از دستور imcontrast

تمرين : در مورد هر يك از قابليت‌هاي فوق به طور عملي تحقيق كنيد. يعني برنامه اي براي كار با هر يك از دو دستور اول نوشته و اثر آنها را بررسي كنيد. همچنين نحوه‌ي استفاده از ابزار مذكور (شماره ي 3) را بررسي كنيد.

ذخيره‌ي يك تصوير در حافظه‌ي كامپيوتر

از دستورimwrite براي ذخيره‌ي اطلاعات تصويري موجود در يك آرايه به صورت يك فايل تصويري در حافظه‌ي كامپيوتر استفاده مي‌شود. شما مي‌توانيد از هر يك از قالب‌هاي تصويري مورد پشتيباني متلب استفاده كنيد. مثلاً:

imwrite (I2, 'pout2.png');

محتويات فايل ذخيره شده را بررسي كنيد

براي اينكه ببينيد فايل ذخيره شده در مرحله ي قبل چه ويژگي‌هايي دارد، مي‌توانيد از دستور imfinfo استفاده كنيد. اين دستور اطلاعات مختلفي در مورد تصوير مورد نظرتان ارائه مي‌دهد. براي استفاده، به صورت زير عمل كنيد:

imfinfo('pout2.png')

مثال 2- تحليل تصوير

1- خواندن تصوير

تعريف تصوير سطح خاكستري

تصوير سطح خاكستري rice.png را خوانده و در يك آرايه به نام I ذخیره کنید.

I=imread('rice.png');

حال آن را نمايش دهيد:

imshow(I)

تعريف پس زمينه

تعريف پيش زمينه

ملاحظه مي‌كنيد كه پس زمينه تصوير يكنواخت نيست بلكه در قسمت‌هاي مركزي روشنتر و در قسمت‌هاي پاييني تيره تر است. عدم يكنواختي پس زمينه، اغلب باعث دشوارتر شدن كار جداكردن اشياء از تصوير مي‌شود.

2 -تخمين پس زمينه

از عملگر مورفولوژي بازكردن (شامل اعمال متوالي كاهش و سپس گسترش هر دو به كمك يك ماسك مشترك) براي حذف دانه‌هاي برنج استفاده مي‌كنيم تا بتوانيم به پ سزمينه دست پيدا كنيم. اثر نهايي عملگر بازكردن اين است كه اشيايي را كه نمي توانند ماسك را در بربگيرند، حذف مي‌كند (اطلاعات بيشتر درمورد عملگرهاي مورفولوژي در فصل 10 آمده است).

براي استفاده از عملگر بازكردن از دستورimopen به صورت زير استفاده مي‌كنيم:

background=imopen(I,strel('disk',15));

آرگومان اول، تصوير مورد نظرمان و آرگومان دوم ماسك مورد استفاده براي انجام عمل بازكردن است. در اينجا براي تشكيل ماسك از دستور strel استفاده شده است. دستور مذكور در اين مثال براي ايجاد يك ماسك دايره اي به شعاع 15 پيكسل مورد استفاده قرار گرفته است. اندازه ي ماسك را به گونه اي انتخاب كرده‌ايم كه هيچ دانه ي برنجي نتواند ماسك را به طور كامل در بر بگيرد و در نتيجه از تصوير حذف شود. اگر تقريب فوق را به كمك دستورimshow نمايش دهيم نتيجه چنين خواهد بود:

مشاهده (و نمايش) تقريب پس زمينه به صورت يك سطح

براي نمايش پس زمينه به صورت يك سطح از دستور surf استفاده مي‌كنيم؛ اما اين دستور نياز به آرگوان ورودي از نوع double دارد در حاليكه تصوير موجود در آرايه‌ي background از نوع uint8 است. بنابراين،در حين استفاده از دستور surf كار تبديل نوع را هم انجام مي‌دهيم:

figure, surf(double(background(1:8:end)),zlim([0 255]); set (gca,'ydir','reverse')

تفريق پس زمينه از تصوير اصلي

براي ايجاد يك تصوير با پس‌زمينه يكنواخت، مي‌توان تقريب بدست آمده از پس‌ زمينه را از تصوير اصلي كم كرد و حاصل را نمايش داد:

I2=I-background; figure,imshow(I2)

افزايش كانتراست تصوير

تصويري كه تا بحال بدست آورديم پس زمينه تقريباً يكنواختي دارد اما تا حدي تار است و بايد كانتراست ان را افزايش دهيم.در اينجا مي‌خواهيم از دستور imadjust براي انجام اين كار استفاده كنيم. اين دستور يك درصد از داده‌هاي بالا و پايين را اشباع مي‌كند و بقيه ي مقادير را طوري تغيير مي‌ دهد كه از تمام بازه ي تغييرات ممكن (در اينجا يعني از 0 تا 255 كه مربوط به نوع داده ي uint8 است) استفاده شود.

I3=imadjust(I2) figure, imshow(I3)

آستانه گيري تصوير

تعريف آستانه گيري

تعريف تصوير دودويي (يا باينري )

نحوه‌ي دودويي كردن، تعريف آستانه، اهميت مقدار آستانه

برخي مزاياي استفاده از تصاوير باينري (چرا به دنبال دودويي كردن بايد باشيم؟): الف – حجم پايين پردازش‌ها (سرعت اجراي بالا) ب- بدست آوردن اطلاعات مفيد از تصوير (مانند تعداد اشياء، مساحت هركدام، موقعيت هر شي ء) اين دستور براي تبديل يك تصوير سطح خاكستري به تصوير باينري از دستور im2bw مي‌توان استفاده كرد. این دستور نياز به مقدار يك آستانه دارد. براي انتخاب مناسب مقدار آستانه، مي‌توانيم از دستور graythresh استفاده كنيم.

level1=graythresh(I3) bw=im2bw(I3,level1)

براي حذف نويز، مي‌توانيم از دستور bwareaopen استفاده کنیم. ایده‌ی ايده‌ي اساسي اين است كه نويز عموماً شامل نقاط با مساحت كم است.بنابراين مي‌توان هر شيء با مساحتي كمتر از يك حد را نويز دانست. بنابراين به كمك عملگر مورفولوژي بازكردن مي‌توان تمام اشيايي كه مساحتشان كمتر از يك مقدار مشخص (در اينجا 50 ) باشد را حذف كرد.

توجه: مقدار 50 در حقيقت تابعي از رزولوشن (يا درجه تفكيك) تصوير است. هر چه رزولوشن بيشتر باشد، بايد مقدار اين آستانه را نيز بزرگتر در نظر گرفت.

تعريف رزولوشن (در مكان و در مقدار)؟

تعريف dpi

bw=bwareaopen(bw, 50); figure, imshow(bw)

شناسايي اشياء در تصوير

تعريف جزء به هم پيوسته

براي استخراج اجزاء به هم پيوسته از يك تصوير باينري مي‌توان از هر يك از دستورات bwlabeln ،bwlabel، bwconncomp استفاده كرد اما بهترين و جديدترين آنها دستور است bwconncomp كه حافظه كمتري مصرف كرده و گاهاً سريعتر نيز مي‌باشد.

در پنجره فرمان دستورات زير را وارد كنيد:

cc=bwconncomp(bw,4) cc.NumObjects

نتیجه:

cc=connectivity:4 imagesize:[256 256] numobjects: 95 PixelIdxList:{1x95 cell}

ans=95

تمرين 1: پيدا كردن و پاك كردن بزرگترين شيء در يك تصوير باينري

CC = bwconncomp(BW); numPixels = cellfun(@numel,CC.PixelIdxList); [biggest,idx] = max(numPixels); BW(CC.PixelIdxList{idx}) = 0;

توضيحات دستورات cellfunو numel

تمرين 2: معرفي و استفاده از دستور regionprops

براي كسب برخي اطلاعات از يك تصوير باينري، ابتدا اطلاعات اجزاء به هم پيوسته‌ي آن را به كمك يكي از سه دستور مذكور(مانند bwconncomp ) استخراج كرده و به دستور regionprops بدهيد. اين دستور برخي ويژگي‌ها را محاسبه مي‌كند كه عبارتند از:

>>S = regionprops(CC,'all'); S =88x1 struct array with fields: Area Centroid BoundingBox SubarrayIdx MajorAxisLength MinorAxisLength Eccentricity Orientation ConvexHull ConvexImage ConvexArea Image FilledImage FilledArea EulerNumber Extrema EquivDiameter Solidity Extent PixelIdxList PixelList Perimeter

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

S = regionprops(CC,'Centroid','Area');

تمرين 3: استفاده از دستورات bwlabeln وbwlabel و نيز دستور imtool

BW = imread('text.png'); L = bwlabel(BW,4); % or use L = bwlabeln(BW,4); [r,c] = find(L == 2) imtool(L)

نكته 1: شيء با شماره‌ي صفر همان پس زمينه است.

نكته 2: خروجي دستور bwconncomp نوع سلول است (نه يك ماتريس مانند L در مثال فوق). برای اينكه در اين دستور هم بتوانيم يك خروجي ماتريسي مانند ماتريس L در در مثال اخير داشته باشيم از دستورlabelmatrix مي‌توانيم استفاده كنيم:

BW = imread('text.png'); CC = bwconncomp(BW); L = labelmatrix(CC); L2 = bwlabel(BW); whos L L2

بررسي يك شيء

نشان دادن دانه برنج با شماره ي 50

grain=false((bw)size) grain(cc.pixelIdxList{50})=true; figure, imshow(grain)

مشاهده‌ي تمام اشياء

ابتدا از دستور labelmatrix براي تهيه ماتريس برچسب استفاده مي‌كنيم:

labeled=labelmatrix(cc); whose labeled

حال براي اينكه هر دانه برنج را با يك رنگ نشان دهيم تا بتوانيم تصويري رنگي مشاهده كنيم، ماتريس به دست آمده را به كمك دستور label2rgb به يك تصوير رنگي تبديل كرده و آن را نمايش مي‌دهيم:

RGB_label=label2rgb(labeled,@spring,'c','shuffle'); figure,imshow(RGB_label)

تمرين: از دستورlabel2rgb راهنما بگيريد و در مورد نحوه استفاده از رنگ آميزي‌هاي مختلف تحقيق كنيد. در اينجا ممكن است به دستور>>help graph3d نياز داشته باشيد.

محاسبه مساحت اشياء مختلف

هر دانه برنج يك جزء به هم پيوسته است. به كمك دستور regionprops اطلاعاتي را مي‌توان در مورد هر دانه برنج كسب كرد:

graindata=regionprops(cc, 'basic')

براي دسترسي به مساحت برنج 50 اُم :

graindata(50).Area ans=194

محاسبه‌ي برخي ويژگي‌ها از روي مساحت

ابتدا اطلاعات مساحت دانه‌هاي برنج را در يك آرايه جداگانه ذخيره كرده و سپس، كوچكترين دانه برنج را پيدا كنيد:

grain_area=[graindata.Area]; min(grain_area)=[min_area, idx] grain=false(size(bw)) grain(cc.pixelIdxList{idx})=true figure; imshow(grain)

نتيجه (مقدار مساحت و شماره‌ي كوچكترين دانه برنج):

min_area=61; idx=16

توليد هيستوگرام براي مساحت‌هاي دانه‌هاي برنج

چه اطلاعاتي از هيستوگرام مي‌توان به دست آورد؟

الف- عمده دانه-برنج‌ها چه مساحتي دارند؟

ب- چقدر دانه-برنج‌ها يكدست هستند؟

از دستور hist براي توليد هيستوگرام برداري از داده‌ها استفاده مي‌‌كنيم. مي‌توانيم تعيين كنيم كه محدوده تغييرات داده‌ها در بردار ورودي به چند بازه تقسيم شود.

nbins=20; figure, hist(grain_areas,nbins) title('Histogram of Rice Grain Area')

توجه: براي ديدن نمايشي از قابليت‌هاي پردازش تصوير در متلب دستور زير را وارد كنيد تا صفحه مربوطه براي شما نمايش داده شود.

iptdemos



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



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