آشنايي با نحوه انجام تبديلات مكاني مختلف

آشنايي با نحوه انجام تبديلات مكاني مختلف

منظور از تبديل مكاني تغيير دادن رابطه‌ي مكاني بين پيكسل‌هاي موجود در تصوير اصلي است.

تغيير ابعاد تصوير

براي تغيير ابعاد يك تصوير از تابع imresize مي‌توان استفاده كرد. در اين تابع بايد ضريب بزرگ نمايي را كه عددي كوچك‌تر يا بزرگ‌تر از 1 است، تعيين كرد. اگر قصد بزرگ‌تر كردن اندازه‌ي تصوير را داريد بايد عددي بزرگ‌تر از 1 و اگر قصد كوچك‌تر كردن اندازه‌ي تصوير را داريد بايد عددي كوچك‌تر از 1 را انتخاب كنيد.

مثال:

I = imread('circuit.tif'); J = imresize(I,1.25); imshow(I) figure, imshow(J)

به جاي تعيين ضريب بزرگ‌نمايي، مي‌توانيد ابعاد تصوير خروجي را تعيين كنيد، اما اگر ابعاد را به درستي انتخاب نكنيد تصوير خروجي کج می شود. اگر به جاي يكي از ابعاد تصوير از NAN استفاده كنيد، متلب به طور خودكار آن را طوري محاسبه مي‌كند كه نسبت ابعاد 4 تصوير اوليه حفظ شود. مثال

I = imread('circuit.tif'); J = imresize(I,[100 150]); imshow(I) figure, imshow(J)

براي تغيير ابعاد مورد نياز در پردازش چند درجه‌ي تفكيك مي‌توانيد از تابع impyramid استفاده كنيد.

تابع imresize براي افزايش ابعاد تصوير از درونيابي استفاده مي‌كند. روش پيش فرض براي درون‌يابي،است.روش 'bicubic' مي توان از روش‌هاي 'bilinear' و 'nearest' نيز استفاده كرد (براي ديدن حالت‌هاي مختلف به صفحه‌ي مرجع دستورimresize مراجعه كنيد). مثال:

Y = imresize(X,[100 150],'bilinear')

جلوگيري از پديده همپوشاني (فركانسي)

در هنگام كاهش ابعاد تصوير (به ويژه تصاوير با تباين زياد)، تصوير حاصله داراي الگوهاي پله‌اي شكل و يا الگوهاي اثر ريپل (به نام moire) خواهد بود. براي كاهش ميزان اين اثر، دستور imresize به طور پيش فرض (به جز براي درونيابي نوع nearest') از فيلترهاي ضدهمپوشاني استفاده مي‌كند. براي غيرفعال كردن استفاده از اين فيلترها، ويژگي (يا پارامتر) Antialiasing را برابر false قرار دهيد.

چرخاندن يك تصوير

از دستور imrotate براي چرخاندن يك تصوير مي توان استفاده كرد. در اين دستور مقدار زاويه‌ي چرخش بر حسب درجه نيز ذكر مي شود. اگر مقدار درجه مثبت باشد، در خلاف جهت حركت عقربه هاي ساعت و اگر مقدار درجه منفي باشد، در جهت حركت عقرب ههاي ساعت عمل چرخش انجام مي‌شود. تصوير خروجي معمولاً بزرگتر از تصوير ورودي است تا تصوير اوليه را در برگيرد. اما اگر بخواهيد، مي‌توانيد به كمك اضافه كردن آرگومان 'crop' ابعاد تصوير خروجي را برابر تصوير ورودي تنظيم كنيد. دستور imrotate از درون‌يابي نزديك‌ترين همسايه (nearest‐neighbor) براي محاسبه پيكسل‌هاي خروجي تصوير استفاده مي‌كند. براي ديدن ليست ديگر روش‌هاي درون‌يابي موجود در دستور مذكور به صفحه‌ي مرجع آن مراجعه كنيد.

I = imread('circuit.tif'); J = imrotate(I,35,'bilinear'); imshow(I) figure, imshow(J)

برش (يا كندن تكه‌اي از) يك تصوير

براي استخراج يك ناحيه‌ي مستطيلي- شكل مي‌توانيد از دستور imcrop استفاده كنيد. مشخصات ناحيه‌ي مذكور را مي توانيد به كمك ماوس و يا با برنامه نويسي تعيين كنيد.

مثال (استفاده از ماوس):

I = imread('circuit.tif') J = imcrop(I);

مثال (استفاده از برنامه نويسي):

I = imread('circuit.tif'); J = imcrop(I,[60 40 100 90]);

انجام تبديلات دوبعدي مكاني دلخواه

براي انجام يك تبديل مكاني دلخواه سه مرحله بايد طي شود:

1- تعيين پارامترهاي تبديل مكاني

2-ايجاد ساختاري به نام TFORM

3-انجام تبديل به كمك دستور imtransform

يك ساختار TFORM، ساختاري است كه شامل تمام پارامترهاي لازم براي انجام يك تبديل دوبعدي مي‌باشد. براي توليد يك ساختار TFORM مي‌توان از دستور maketform استفاده كرد.

مثال: انجام يك تبديل مكاني دوبعدي

در اين مثال، يك تبديل ساده به نام انتقال انجام مي‌شود.

گام 1: خواندن تصوير ورودي

cb = checkerboard; imshow(cb)

گام 2: تعريف تبديل

براي تعريف بسياري از تبديلات استفاده از يك ماتريس مربعي به طول 3 كافي است. شما مي‌توانيد با تعيين چند جفت نقطه متناظر از تصوير ورودي و خروجي نيز، تبديل را مشخص و از دستور maketform براي ايجاد ماتريس مربعي مذكور استفاده كنيد. در اين مثال از ماتريس تبديل زير استفاده مي‌شود (معادل عمل انتقال است):

xform = [ 1 0 0 0 1 0 40 40 1 ]

اولين عدد 40 (از چپ) معرف ميزان جابجايي در راستاي افقي و دومين عدد 40 معرف ميزان جابجايي در راستاي عمودي است.

گام 3: ايجاد ساختار TFORM

براي ايجاد يك ساختار TFORM مي‌توان از دستور maketform استفاده كرد. از جمله آرگومان‌هاي ورودي اين دستور، تعيين نوع تبديل و تعيين ماتريس (يا مجموعه‌ي جفت-نقاط) تبديل است.

نوع تبديل شامل انواع زير مي‌تواند باشد (براي توضيحات بيشتر به صفحه‌ي مرجع مراجعه كنيد):

'affine' Affine transformation in 2‐D or N‐D 'projective' Projective transformation in 2‐D or N‐D 'custom' User‐defined transformation that can be N‐D to M‐D 'box' Independent affine transformation (scale and shift) in each dimension 'composite' Composition of an arbitrary number of more basic transformations

tform_translate = maketform('affine',xform);

گام 4: انجام تبديل

براي انجام تبديل، از دستور imtransform به همراه تصوير ورودي و ماتريس تبديل مورد نظرمان استفاده مي‌كنيم.

[cb_trans xdata ydata]= imtransform(cb, tform_translate);

آرگومان‌هاي خروجي به ترتيب شامل نتيجه‌ي تبديل (تصوير تبديل يافته)، و مختصات افقي (راستاي x) و مختصات عمودی (راستای y) گوشه‌هاي تصوير تبديل يافته مي‌باشند.

توجه: در اين بخش از سيستم مختصات‌دهي مكاني استفاده مي‌شود.

شكل زير تبديل انجام شده در اين مثال را به صورت گرافيكي نشان مي‌دهد. ملاحظه مي‌كنيد كه پيكسل واقع در مختصات ( 1،1 ) از تصوير ورودي به مختصات ( 41،41 ) در تصوير خروجي منتقل شده است. (براي ديدن انواع روش‌هاي موجود براي درون‌يابي به صفحه‌ي مرجع دستور imtransform مراجعه كنيد).

figure, imshow(cb_trans)

ممكن است فكر كنيد كه چون تصوير خروجي مشابه تصوير ورودي شده، پس عمل تبديل تاثيري نداشته است؛ اما، واقعيت اين است كه تبديل انتقال تاثيري روي مقادير پيكسل‌ها ندارد بلكه روي مختصات آن‌ها تاثيرگذار است. اگر به مقادير آرگومان‌هاي خروجيِ دستورِ imtransform یعنی xdata و ydata نگاهی بیندازید، ملاحظه مي‌كنيد كه مقادير مختصات مكاني تغيير كرده‌اند.

اگر مي‌خواهيد كه تصوير خروجي نسبت به مبدا مختصات جديد نمايش داده شود، از ويژگي‌هاي XData و YData به صورت زير استفاده كنيد:

cb_trans2 = imtransform(cb, tform_translate,... 'XData', [1 (size(cb,2)+ xform(3,1))],... 'YData', [1 (size(cb,1)+ xform(3,2))]); figure, imshow(cb_trans2)

تعريف داده‌هاي مربوط به تبديل

همان طور كه گفته شد دو راه براي مشخص كردن نحوه انجام تبديل وجود دارد: يكي استفاده از ماتريس تبديل و ديگري مشخص كردن تعدادي جفت-نقطه‌ي متناظر در تصاوير ورودي و خروجي. در هر دو حالت، بايد نتيجه را به دستورmaketform بدهيم.

راه اول:

با استفاده از دستور maketform و دادن یک ماتریس تبدیل 3*3 مناسب به آن می‌توان یک ساختار TFORM که مناسب برای استفاده در دستور imtransform باشد را ایجاد کرد. دستور imtransform فقط قادر به انجام تبديلات دو بعدي است. يكي از انواع متداول تبديلات دو بعدي، تبدیل affine است. برای داشتن اين نوع تبديل بايد سطر آخر ماتريس تبديل به صورت بردار ستوني [0:0:1] باشد.

راه دوم

در روش دوم، مجموعه‌اي از جفت-نقاط متناظر متعلق به تصوير ورودي و تصوير خروجي را مشخص مي‌كنيم و آنها را به دستور maketform مي‌دهيم. شما بايد سه جفت نقطه (يعني در كل، 6 نقطه) متناظر و غير واقع بر يك خط راست از تصوير ورودي و تصوير خروجي را مشخص كنيد. اين سه جفت نقطه در حقيقت يك مثلث را در تصوير ورودي و در تصوير خروجي مشخص مي‌كنند.

in_points = [11 11;21 11; 21 21] out_points = [51 51;61 51;61 61] tform2 = maketform('affine',inpts,outpts)

ايجاد ساختار TFORM

بعد از ايجاد داده هاي تبديل (مطالب قسمت قبلي)، بايد به كمك دستور maketform یک ساختار TFORM ایجاد کنید و سپس آن را به دستور imtransform بدهید تا تبدیل را انجام دهد.

نحوه‌ي استفاده از دستور maketform در مثال زير نشان داده شده است:

tform_translate = maketform('affine',xform)

آرگومان اول، نوع كليِ تبديل و آرگومان دوم نيز داده‌هاي تبديل را مشخص مي‌كنند. در حالت كلي دو نوعِ کلی projective و affine وجود دارد اما علاوه بر اين‌ها، دستور maketform انواع ديگري را نيز پشتيباني مي‌كند.

انجام تبديل

حال به كمك دستور imtransform تبديل را انجام مي‌دهيم. براي نمونه، در مثالي كه عمل تبديل انتقال را انجام مي‌داد، از دستور زير استفاده شده بود:

cb_trans = imtransform(cb, tform_translate);

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

مشخص كردن مقدار مورد استفاده براي پركردن نواحي خالي (fill value)

مقدار پيش فرضِ fill value برابر صفر (متناظر با رنگ سياه) است. براي مقادير (يا رنگ‌هاي) ديگر بايد پارامتر FillValues را مقداردهي كنيد:

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

براي مثال، در مثال تبديل انتقال مي‌توان چنين نوشت:

cb_fill = imtransform(cb, tform_translate,... 'XData', [1 (size(cb,2)+xform(3,1))],... 'YData', [1 (size(cb,1)+xform(3,2))],... 'FillValues', .7 ); figure, imshow(cb_fill)

ب- تصاوير رنگي

مي‌توان از يك عدد اسكالر يا يك بردار سه مقداره استفاده كرد. مثال:

rgb = imread('onion.png'); xform = [ 1 0 0 0 1 0 40 40 1 ] tform_translate = maketform('affine',xform); cb_rgb = imtransform(rgb, tform_translate,... 'XData', [1 (size(rgb,2)+xform(3,1))],... 'YData', [1 (size(rgb,1)+xform(3,2))],... 'FillValues', [187;192;57]); figure, imshow(cb_rgb)

اگر بخواهيد تبديلي را روي چندين تصوير ورودي (مقلاً يك آرايه‌ي 4-بعدي شامل 10 تصوير رنگي هر يك به ابعاد 200×200×3) مختلف انجام دهيد، براي تعيين مقدار fill value سه راه مختلف داريد. اول اين كه يك مقدار اسكالر را به تنهايي مشخص كنيد؛ يعني، نواحي خالي با يك رنگ خاكستري پر شود. دوم اين‌كه يك بردار سه مقدار را مشخص كنيد؛ يعني نواحي خالي را با يك رنگ مشخص پر كنيد. سوم اين كه يك ماتریس 3*10 (3 سطر و 10 ستون) را مشخص كنيد؛ يعني، هر تصوير از رنگ مخصوص به خود براي پر كردن نواحي خالي مربوطه استفاده مي‌كند.

مثال: تثبيت تصوير

گام 1 : خواندن تصاوير پايه و تثبيت نشده

base = imread('westconcordorthophoto.png'); unregistered = imread('westconcordaerial.png');

گام 2 : نمايش تصوير تثبيت نشده

iptsetpref('ImshowAxesVisible','on') imshow(unregistered) text(size(unregistered,2),size(unregistered,1)+30, ... 'Image courtesy of mPower3/Emerge', ... 'FontSize',7,'HorizontalAlignment','right');

گام 3 : ايجاد يك ساختار TFPRM

در اين مرحله با استفاده از تعدادي نقاط كنترلي از قبل تعيين شده يك ساختار TFPRM ايجاد مي‌كنيم. اين جفت نقاط كنترلي (چند نقطه مربوط به تصوير پايه و چند نقطه هم مربوط به تصوير تثبيت نشده) در يك فايل MAT ذخيره شده‌اند لذا ابتدا اين فايل بارگذاري و سپس استفاده مي‌شود:

load westconcordpoints tform = cp2tform(input_points, base_points, 'projective')

دستور cp2tform از روي جفت نقاط داده شده به آن، ساختار TFORM متناظر را به ما می‌دهد.

گام 4 : تبديل تصوير تثبيت نشده

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

registered = imtransform(unregistered, tform,'FillValues', 255);

براي نمايش تصوير تثبيت شده:

figure; imshow(registered); hold on

گام 5 : روي هم قرار دادن تصوير پايه و تصوير تثبيت شده در اين مرحله يك نسخه‌ي نيمه شفاف از تصوير پايه را روي تصوير تثبيت شده قرار مي‌دهيم:

h = imshow(base, gray(256)); set(h, 'AlphaData', 0.6)

ملاحظه مي‌كنيد كه دو تصوير به خوبي روي هم قرار نگرفته‌اند. (يا به اصطلاح، تثبيت نشده به نظر مي‌رسند و گرنه ما مي‌دانيم كه واقعاً تثبيت شده‌اند) علت اين امر اين است كه در اين مثال فرض شده‌است كه هر دو تصوير در يك سيستم مختصات مشترك قرار دارند كه البته، اين طور نيست.

در گام‌هاي بعدي، دو روش براي حل اين مشكل ارائه مي‌شود.

گام 6 : استفاده از پارامترهاي ورودي YData و XData

يك راه براي اينكه كاري كنيم كه تصاوير تثبيت شده، واقعاً تثبيت شده به نظر برسند، اين است كه آن نواحي‌اي از تصوير تثبيت شده را كه خارج از حدود تصوير پايه است، برش بزنيم. براي اين كار از پارامترهاي 'YData' و 'XData'استفاده مي‌كنيم:

registered1 = imtransform(unregistered,tform,'FillValues', 255,'XData',… [1 size(base,2)],'YData', [1 size(base,1)]);

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

figure; imshow(registered1) hold on h = imshow(base, gray(256)); set(h, 'AlphaData', 0.6)

ملاحظه مي‌كنيد كه عمل تثبيت شدن به خوبي نشان داده شده است اما قسمتي از تصوير تثبيت شده حذف شده است. گام بعدي راه ديگري ارئه مي‌دهد.

گام 7 : استفاده از مقادير خروجيِ ydata و xdata

يك راه ديگر اين است كه تصوير تثبيت شده را با تمام محدوده‌ي مختصات خود محاسبه كنيم و از گزينه‌ي اختياري موجود در دستور imtransform كه مختصات تصوير تبديل يافته نسبت به تصوير اصلي (اوليه) را برمي‌گرداند، استفاده كنيم.

[registered2 xdata ydata] = imtransform(unregistered, tform, 'FillValues', 255);

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

figure; imshow(registered2, 'XData', xdata, 'YData', ydata) hold on h = imshow(base, gray(256)); set(h, 'AlphaData', 0.6)

حال محورها را به گونه‌اي تنظيم مي‌كنيم كه تصوير پايه به طور كامل نشان داده شود. حال با توجه به اين شكل ملاحظه كنيد كه چگونه عمل تثبيت به خوبي نشان داده شده است و نمايش داده شده‌اند.

ylim = get(gca, 'YLim'); set(gca, 'YLim', [0.5 ylim(2)])



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



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