السلام عليكم ورحمة الله وبركاته
انا هذيع الحلقة النهاردة من برنامج الماتلاب
والحلقة بعنوان
التصنيف
“ Classification “
الحلقة دي للاسف معانا ضيف رخم ...والحلقة شكلها هتطول
ضيفنا هو ... صورة كبيرة ورغاية , .. احنا عايزين ناخد من الضيف ده المفيد
والمفيد هو عملية التصنيف
نفهم الاول ازاي نتعامل مع الضيف ... نكرمه طبعا
احنا هنتعامل معاه من خلال برنامج عشان ناخد منه اللي احنا عايزينه
والبرنامج ده مكون من 5 مراحل
قبل ما نخش في البرنامج نفهم الاول الهدف منه ايه
ان احنا لو عندنا مثلا صورة لارض معينة .
.. والارض دي فيها مباني ومساحات خضرا وطرق وحاجات تانية كتييير
الهدف من العملية دي
ان احنا مثلا عايزين نطلع المباني بس من الصورة الاساسية في صورة لوحدها
نيجي بقى للبرنامج
البرنامج متقسم لـ 5 مراحل تمااام ؟؟
1- Load image
Building signature -2
Cell array names -3
Prepare data for classification -4
Look at the classified data -5
ناخد مرحلة مرحلة ونفهمها
المرحلة الاولى
(1) Load image
f=imread('D:\A.jpg');
f1=f(:,:,1);
ودي مرحلة تعريف ( الضيف بنفسه ) عرض وتسمية الصورة اللي احنا عايزين نصنف منها
وبعدين احنا عارفين ان اي صورة في الدنيا عبارة عن عدد من الطبقات منطبقين على بعض ... احنا في البرناج ده
هنتعامل مع طبقة واحدة بس ... ده لتسهيل البرنامج مش اكتر لكن في الحقيقة لازم نتعامل مع اكتر من طبقة وده لزيادة الدقة
نييجي للمرحلة التانية
(2) Building Signature
B=roipoly(f1);
[m,n]=size(f1);
B1=zeros(m,n);
for i=1:m
for j=1:n
if B(i,j)==1
B1(i,j)=f1(i,j);
end
end
end
المرحلة دي تعتبر مرحلة تحديد يدوي للي احنا عايزينه ...
قولتولي ازاي
اقولكوا ...
B=roipoly(f1);
الامر ده جامد جدا بيجيبلك الصورة اللي انت مدخلها اللي هي (f1)
وتحدد انت يدوي بالماوس يعني المنطقة اللي انت عايزها وليكن المباني بس لازم يبقى شكل مغلق
فــ توماتيكي كده لوحده المنطقة اللي انت حددتها كل بكسل فيها هيديها رقم (1) وكل بكسل برا التحديد هيديها رقم (0)
احنا كده يعتبر عملنا صورة جديدة كل بكسل فيها يا اما 1 يا اما 0
وسمينا الصورة دي(B)
تماااام ؟؟
[m,n]=size(f1);
وبعدين نحدد حجم الصورة الاساسية قد ايه ... عدد الصفوف والاعمدة
B1=zeros(m,n);
وبعدبن نكون صورة جديدة ليها نفس الحجم بتاع الصورة الاساسية
بس صورة فاضية كلها اصفار
الصورة دي --- هي اللي انا عايزها بس اكيد مش عايزها فاضية
عايزنها بعد ما نملاها ... ازاي هنعرف بعد شوية
for i=1:m
for j=1:n
if B(i,j)==1
B1(i,j)=f1(i,j);
end
end
end
ركزوا يا جماعة معايا في الجزء ده عشان مهم جدااا
هنعمل لووب للصفوف والاعمده .. تماااام وهنمشي بكسل بكسل
احنا دلوقتي عندنا كام صورة ... 3 تماااام
الصورة (B) اللي فيها منطقة التحديد وكل بكسل فيها 1 او 0
الصورة الاساسية (f1) " اللي مشرفانا "
الصورة الفاضية اللي انا كونتها (B1)
تخيلوا معايا كده ان احنا حطينا الـ3 صور دول فوق بعض بالترتيب كده زي ما انا كاتبهم
هناخد كل بكسل قيمته 1 في الصورة (B) اللي هي منطقة التحديد
وناخد الديجيتال نمبر بتاع البكسل المسقط في الصورة (f1)
ونسقطه في الصورة (B1)
يبقى احنا كده ملينا الصورة (B1) بمنطقة التحديد والديجيتال نمبر بناع كل بكسل فيها
N=m*n
VB1=[reshape(B1,N,1)];
VB1=VB1(VB1>0);
pause
هنعيد تشكيل الصورة (B1) اللي هي اساسا عبارة عن مصفوفة هنخليها فكتور واحد
عمود
وبعدين نخليه ياخد القيم اللي اكبر من 0 بس
يبقى احنا كده معانا الفيكتور (VB1) في قيم البكسل بتاعة منطقة التحديد بس
واخيييرا المرحلة دي خلصت
نييجي للمرحلة التالتة
(3) Cell array names
L1=length(VB1);
for i=1:L1
name1(i)=1
end
name1=name1'
pause
names=[name1;name2;name3];
المرحلة دي بسيطة اوي ... هي
تسمية منطقة التحديد مش اكتر بس نفهم هو عملها ازاي...
نجيب حجم الفيكتور اللي احنا طلعناه اللي هو كل بكسل فيه اسمه 1 ... بس كل
بكسل فيه ليه ديجيتال نمبر مختلف
ونعمل لووب ونسمي منطقة التحديد باسم معين
وبعدين نجيب الترانسبوز بتاع الفيكتور الجديد المتسمي
وبعدين ممكن نكرر المرحلة دي لو عايزين اكتر
من منطقة تحديد ..زي مثلا المباني ... الطرق ... وهكذا
بس خلاص المرحلة دي
نييجي للمرحلة الرابعة
4- Prepare data for classification
[nx,ny]=size(f1)
N=nx*ny;
Allpix=[reshape(f1,N,1)];
Allpix=double(Allpix);
signatures=double(signatures);
classifydata[class,misfit]=classify(Allpix,signatures)
المرحلة دي ماهي الا ..
نعيد شكل الصورة الاساسية (f1) نخليها كلها في فكتور واحد
Double ماهو الا زيادة الدقة في الديجيتال نمبر في كل بكسل
Signature لزيادة دقة التصنيف
classifydata[class,misfit]=classify(Allpix,signatures)
misfit بيظبط شكل البكسل يعني لو منطقة التحديد مثلا على شكل مثلث
فـ على طرف الشكل مش هياخد بكسل كامل ... هياخد نص بكسل
وبكدا الصورة اتصنفت بس هي دلوقتي ... على شكل فيكتور
عايزين نرجعها لصفوف واعمده تاني .... ده هيبقى في المرحلة الاخيرة
5- Look at the classified data
class=reshape(class,nx,ny)
map=[225,212,116;109,105,38;183,32,47]/255;
figure(2),clf,color(map)
image(class),colorbar
title('1=building,2=green area,3=roads');
المرحلة الاخييرة
اول حاجة عملناها في المرحلة دي خلينا الفيكتور في مصفوفة صفوف واعمده تاني
وبعدين ندخله الوان الصورة اللي احنا عايزينها ...على هيئة ارقام
وبعدين قسمنا على 255 لتوسيع الفروق بين الالوان
بعد كده
Clf : ده امر بتجهيز الصورة بالالوان اللي انا دخلتها
image(class),colorbar : ده بيجيبلي دليل الالون بتاع الخريطة
title('1=building,2=green area,3=roads');
وده بيوضحلي عناويين بتاع كل منطقة انا حددتها
وكده تبقى المراحل الخمسة خلصوا اخيييييييييييييرا
ملحوظة ....
اللي عنده ماتلاب على جهاز ضعيف الامكانيات ميحاولش يجرب البرنامج ده ...
الجهاز ممكن يشتمه
في نهاية الحلقة نشكر ضيفنا الرخم ... ونقوله متجيش هنا تاني
والسلام عليكم ورحمة الله وبركاته
اسيبكم مع ( التتر ) البرنامج كامل كله على بعضه
f=imread('D:\A.jpg');
f1=f(:,:,1);
% Building signature
B=roipoly(f1);
[m,n]=size(f1);
B1=zeros(m,n);
for i=1:m
for j=1:n
if B(i,j)==1
B1(i,j)=f1(i,j);
end
end
end
N=m*n
VB1=[reshape(B1,N,1)];
VB1=VB1(VB1>0);
pause
% cell array names
L1=length(VB1);
for i=1:L1
name1(i)=1
end
name1=name1'
pause
names=[name1;name2;name3];
% prepare data for classification
[nx,ny]=size(f1)
N=nx*ny;
Allpix=[reshape(f1,N,1)];
Allpix=double(Allpix);
signatures=double(signatures);
classifydata[class,misfit]=classify(Allpix,signatures)
% look at the classified data
class=reshape(class,nx,ny)
map=[225,212,116;109,105,38;183,32,47]/255;
figure(2),clf,color(map)
image(class),colorbar
title('1=building,2=green area,3=roads');