مـقـدمـة في مـعـالـجـة الـصـور

مقدمة في معالجة الصور
سيتم شرح كلا من :
أنواع الصورة الرقمية في الماتلاب.
فتح وقراءة صورة.
منحني الهيستوغرام و تحسين التباين.
عمليات مختلفة على الصور.

أنواع الصورة الرقمية في الماتلاب :
Binary Image
هي الصورة التي تمثل بمصفوفة بعداها MxN  وهي تحوي اللونين الأسود والأبيض فقط .
بحيث ياخذ كل بكسل قيمة تمثل لون فالأسود يأخذ قيمة 0 بينما الأبيض يأخذ قيمة 1.
(لا يوجد لون رمادي في هذا النوع من الصور). 
Grayscale Image
هي صورة تمثل بمصفوفة ثنائية البعد MxN  وعناصرها من النوع double
تقع بين المجال [0,1] حيث 0 يمثل الأسود و 1 الأبيض و ما بينهما درجات اللون الرمادي.   كل عنصر في المصفوفة يمثل درجة لون لبكسل واحد ابيض او اسود او ما بينهما.
TrueColor RGB Image
هي صورة تمثل بمصفوفة ثلاثية ثلاثية البعد MxNx3 عناصرها من نوع double او unit8 (سوف نشرح النوعين لاحقاً) , فكل بكسل في الصورة ينتج عن دمج ثلاثة مركبات لإعطاء اللون المناسب فالمركبة الحمراء مكونة من مصفوفة ثنائية (تستخرج من المصفوفة ثلاثية البعد) MxN يكون فيها قيمة اللون بين المجال [0,1] الأسود 0 و الأحمر 1 و ما بينهما هو درجات اللون الأحمر , و كذلك بالنسبة للأزرق و الأخضر.
وبدمج ثلاثة الألوان RGB  من ثلاثة مصفوفات ثنائية البعد نحصل على الألوان الحقيقية.
يوجد نوعان لمجال اللون :
Double : يكون مجاله [0,1] بحيث يكون الأسود 0 و اللون 1 و درجات اللون بينهما بحيث تكون قيم اللون اصغر من الواحد (فاصلة) مثلا 0.234 .
Unit8 : تكون قيمته صحيحة Integer و يتراوح مجاله [0,255]  بحيث 0 يمثل الأسود و 255 اللون و ما بينهما درجات اللون.
يستخدم نوع unit8  بدلاً من ال double للتقليل من مساحة الذاكرة و لتسريع من عملية معالجة الصور.

فتح وقراءة صورة :
يتم فتح وقراءة صورة من أي نوع بإستخدام تعليمة Imread: ويتم عرضها بإستخدام التعليمة imshow ونميز حالتين :
1- فتح صورة من الحاسب : لفتح صورة وعرضها  من الجهاز الحاسب نستخدم الصيغة التالية :
;(X=imread (filename,format
Imshow(x);
حيث تتم قراءة الصورة عبر المسار filename ذات الإمتداد format ومن ثم تخزينها في المصفوفة  x .

2- فتح صورة من برنامج الماتلاب نفسه وعرضها نستخدم الصيغة التالية :
X=imread (filename,format );
Imshow(x)

مثال : صورة من نوع RGB
X = imread('onion.png');
imshow(X) ;


Imwrite: بفرض أننا قمنا بمعالجة صورة معينة وأجرينا عليها التغييرات المناسبة ثم أردنا حفظ أو طباعة هذه الصورة على جهاز الحاسب بإسم جديد وإمتداد جديد نستخدم هذه التعليمة بالصيغة التالية:
Imwrite(image , filename);
مثال:
x=imread('C:\Users\DigitalNet\Desktop\ferrari','jpeg')
imshow(x)
imwrite(x,’newferrari.bmp’);

هنا قمنا بطباعة نفس الصورة الموجودة على سطح المكتب إلى مسار الماتلاب الآني (current folder  يظهر في شريط الأدوات في واجهة برنامج الماتلاب ) باسم جديد newferrari وإمتداد جديد bmp.

Iminfo: تمكننا هذه التعليمة بالحصول على معلومات كاملة عن الصورة وبكتاية الصيغة التالية :
info=imfinfo(filename,format)
نحصل على معلومات أهمها :
مسار ملف الصورة – حجم الملف – العرض – الإرتفاع – الإمتداد – نظام الألوان.

تحويل بين الصور :
Im2bw: يمكن تحويل الصورة أيا كان نوعها إلى صورة ثنائية ( أبيض وأسود) بإستخدام هذه التعليمة :
binary image=im2bw(image,level);                                                        
  حيث image  تمثل الصورة الأصلية أما level  فهي شدة العتبة تتراوح بين الصفر والواحد حيث تتحول جميع البكسلات التي قيمتها فوق العتبة إلى الأبيض أو تحمل القيمة 1 أما البكسلات التي تحمل قيم تحت العتبة فتتحول إلى اللون الأسود أو تحمل القيمة صفر .

مثال :
x=imread('C:\Users\DigitalNet\Desktop\mosque','jpeg');
imshow(x);
y=im2bw(x,0.25);
imshow(y);
منحني الهيستوغرام:
يظهر هذا المنحني توزع الاضاءة في الصورة على البكسلات ,حيث يعبر محور السينات على شدة الاضاءة و محور الوايات بكسلات الصورة
باستخدام تعليمة
·       Imhist(I)  
تظهر هذه التعليمة الهيستوغرام (تقسيم الإضاءة داخل الصورة ) للصورة (I) ,إن عدد الـ bins  في الهيستوغرام محدد بنوع الصورة فإذا كان نوع الصورة grayscale فإن imhist يستخدم قيم افتراضية من 256 bins , أما إذا كانت الصورة ثنائية فإن imhist تستخدم 2 bins.
·       Imhist(I,n)  :
تعرض الهيستوغرام حيث n تحدد عدد ال bins المستخدم في الهيستوغرام , و تحدد ايضا طول حاجز اللون , ( إذا كانت الصورة ثنائية n تأخذ قيمتين فقط ).


تحسين تباين الصورة :
يمكن تحسين تباين الصورة باستخدام تعليمة histeq كما يلي :
حيث تقوم هذه التعليمة بفرد مستويات الاضاءة على كافة بكسلات الصورة , و لا تبقى موزعة على بكسلات معينة .
I = imread('pout.tif');
imshow(I)
figure, imhist(I)
I2 = histeq(I);
figure, imshow(I2)
figure, imhist(I2)




و يمكننا تحسين تباين الصورة من خلال :
imadjust  :  يمكننا تعديل تباين الصورة بإستخدام هذه التعليمة ولها عدة أشكال
أحدها :
 j=imadjust(i)                    
وبذلك تكون الصورة j   هي نفس الصورة I  مع زيادة تباين الصورة من خلال زيادة درجة الإشباع 1% للبيانات
مثال :   
I=imread('pout.tif');
imshow(I);
J =imadjust(I);
figure;
imshow(J);



عمليات أخرى على الصورة :
·       تكبير و تصغير حجم الصورة :
Imresize : يمكننا تغيير حجم الصورة ثناثية البعد بإستخدام هذه التعليمة
الصيغة الأولى :  
J=imresize(I,Scale)                                 

حيث  I  هي الصورة قبل إعادة التقييس و scale   نسبة التقييس فإذا كانت أكبر من الواحد فسيزداد حجم الصورة أما إذا كانت أصغر من الواحد فسينقص حجم  الصورة.
تدوير الصورة :
Imrotate: بهذه التعليمة نستطيع تدوير الصورة بزاوية معينة بالدرجات.
J=imrotate(I,Angle);       
حيث  هي الصورة الأصلية المراد تدويرها وangle   زاوية الدوران مقدرة بالدرجات
مثال :
I = imread('circuit.tif');
J = imrotate(I,45,'bilinear');
imshow(I)
figure, 
imshow(J)
·       اقتطاع جزء من الصورة:
Imcrop : يمكننا من خلال هذه التعليمة من إقتطاع جزء من الصورة وإنشاء صورة جديدة من المصورة المقتطعة
J=imcrop(I);                                                                 
حيث j  هي الصورة المقتطعة يدويا حيث يتوجب عليك تحديد الجزء من الصورة الذي نريد إقتطاعه يدويا
·       قلب الصورة :
Fliplr: تمكننا هذه االتعليمة من إجراء قلب للصورة من اليمين لليسار (لا ننسى أن الصورة عبارة عن مصفوفة ) أي وكأن الصورة وضعت أمام مرآة .
J=fliplr(I);
حيث I الصورة الأصلية
Flipud : تمكننا هذه االتعليمة من إجراء قلب للصورة من الأعلى إلى الأسفل  (لا ننسى أن الصورة عبارة عن مصفوفة ) .
J=flipud(I);
حيث I الصورة الأصلية
·       تصميم مرشحات :
Fspecial: تصميم مرشح ثنائي البعد من أحد الأنواع الشهيرة مثل مرشح غاوص أو لابلاسيان أو اللوغاريتمي او المتوسط ....ويمكن كتابته بالصيغة التالية :
h = fspecial(type, parameters );                                                           
حيث  type   تمثل نوع المرشح  و parameter   مواصفات هذا المرشح.
                                               
مثال :
I = imread('cameraman.tif');
subplot(2,2,1);
imshow(I); title('Original Image');

H = fspecial('motion',20,45);
MotionBlur = imfilter(I,H,'replicate');
subplot(2,2,2);
imshow(MotionBlur);title('Motion Blurred Image');
H = fspecial('disk',10);
blurred = imfilter(I,H,'replicate');
subplot(2,2,3);
imshow(blurred); title('Blurred Image');

H = fspecial('unsharp');
sharpened = imfilter(I,H,'replicate');
subplot(2,2,4);
imshow(sharpened); title('Sharpened Image');

·       إضافة ضجيج :
Imnoise  : إضافة ضجيج للصورة بكتابة الصيغة التالية
J = imnoise(I,type)
حيث I هي الصورة الأصلية  type   يمثل نوع الضجيج فقد يكون Gaussian  أو  salt and papper   أو poisson ....

مثال :
I = imread('eight.tif');
J = imnoise(I,'salt & pepper',0.02);
figure,
imshow(I)
figure,
imshow(J)
·       Videoinput : يمكننا هذه التعليمة من تشغيل الفيديو وإستعراضه من كاميرا الحاسب أو أي كاميرا  أو أي كاميرا موصولة معه عن طريق ال USB  وهذه الصيغة
obj = videoinput(adaptorname,deviceID,format)
حيث adaptername   إسم المتغير للكاميرا و deviceID   هورقم يدل على ID   الكاميرا و format   تمثل صيغة العرض قد تكون  YUY2-640*480   أو MJPG-640*480  طبعا لا ننسى أن الرقم  640*480   يمثل حجم الصورة ويمكن تغييره .




مثال :
cam=videoinput('winvideo',1,'YUY2_640x480');
set(cam,'returnedcolorspace','rgb');
vidRes = get(cam, 'VideoResolution');
nBands = get(cam, 'NumberOfBands');
hImage = image( zeros(vidRes(2), vidRes(1), nBands) );
preview(cam,hImage);

ملاحظة :
preview:  لإستعراض الفيديوومشاهدته في نافذة ضمن واجهة الماتلاب
Getsnapshot: مهمته إلتقاط صورة من الكاميرا وتكتب بالصيغة التالية
Image=getsnapshot(obj);
يأتي هذا التابع مرافقا لتابع videoinput   حيث obj    إسم متحول الذي خزن فيه الفيديو

مثال :
cam=videoinput('winvideo',1,'YUY2_640x480');
set(cam,'returnedcolorspace','rgb');
vidRes = get(cam, 'VideoResolution');
nBands = get(cam, 'NumberOfBands');
hImage = image( zeros(vidRes(2), vidRes(1), nBands) );
preview(cam,hImage);
pause(10);
image1=getsnapshot(cam);
figure;
imshow(image1);