تعيين مواقع وحساب مسافة في الصور


(system) #1

أخواني السلام عليكم
عندي صورة ذات مستوى رمادي فيها جسم بلون ابيض
اريد احسب مواقع (position) عندما تكون الشدة 255 في حافة الجسم الابيض من الطرفين
ونعيد تعيين المواقع للحافات لأكثر من 10 مواقع مثلا
الهدف منها هو حساب عرض الجسم الأبيض

ارجو المساعدة باقرب وقت ممكن علما ان الصورة موجودة في المرفقات وشكرا


(Ahmed) #2

[CENTER]وعليكم السلام

اقترح عليك استخدام الدالة
regionprops
فهي تعتبر جد فعالة في مثل هاته التطبيقات

هذه بعض الامثلة على صورتك

الكود الاول

clear all
clc
close all


I=imread('dipum.jpg');
bw = im2bw(I, graythresh(I));
[m n]=size(bw);
L = bwlabel(bw);
imshow(L)

ry = regionprops(L, 'area');
area=cat(1, ry.Area);
[Y,f]=max(area);

c  = regionprops(L, 'Extrema');
centr = cat(1, c.Extrema);
dimen=centr((f-1)*8+1:f*8,:)

for h=1:8
    hold on
    plot(dimen(h,1),dimen(h,2),'+');
end

في هذا الكود استخدمنا خاصية
Extrema
وهي تعطينا 8 حواف للشكل الذي نريد العمل عليه

شرح الكود

اولا
قمنا بتحويل الصورة الى صورة ثنائية، اي 1 و0 فقط
بعدها قمنا بتحويلها مرة اخرى الى صورة “دلالية” والتي تقسم الصورة الثنائية الى مصفوفة حسب الاشكال المتوفرة

ثانيا
استخدمنا الدالة
regionprops
والتي تقسم لنا الصورة الى مناطق حسب المصفوفة السابقة
حتى وان يبدو ان صورتك فيها فقط منطقتين، لكن هناك العديد من المناطق الصغيرة الغير واضحة
لذلك سنختار المنطقة الاكبر والتي تهمنا

ثالثا
قمنا باستخراج حواف المنطقة الكبيرة التي تهمنا باستخدام الخاصية
Extrema
من المفروض انها تعطينا 8 حواف، لما الشكل يكون متعدد الاضلاع

لكن بما انه شبه مستطيل فان بعض الحواف تتطابق
والحواف تكون
353.5000 0.5000
549.5000 0.5000
551.5000 110.5000
551.5000 111.5000
500.5000 704.5000
332.5000 704.5000
332.5000 704.5000
332.5000 703.5000
كما نرى في الصورة

من هذه الاحداثيات تستطيع استخراج العرض

[COLOR=Red]الكود الثاني

[/color]

clear all
clc
close all


I=imread('dipum.jpg');
bw = im2bw(I, graythresh(I));
[m n]=size(bw);
L = bwlabel(bw);
imshow(L)

ry = regionprops(L, 'area');
area=cat(1, ry.Area);
[Y,f]=max(area);

x  = regionprops(L, 'BoundingBox');
centrx = cat(1, x.BoundingBox);
G=centrx(f,:)

hold on
plot(G(1,1),1:m,'+','MarkerSize',2);
    
hold on
plot(G(1,3)+G(1,1),1:m,'+','MarkerSize',2);

هي نفس الدالة
لكن هذه المرة نستخدم خاصية
BoundingBox

اي المستطيل الذي يحوي الشكل

شرح الكود
نفس الشرح للكود السابق
لكن النتيجة هذه المرة تكون احداثيات المستطيل

332.5000    0.5000  219.0000  704.0000

الاحداثيات الاولى

332.5000    0.5000

هي احداثيات اعلى نقطة على اليسار للمستطيل
اي الزاوية العليا اليسرى

الاحداثيات

219.0000  704.0000

هي على التوالي عرض وطول المستطيل

لو نرسم هذا المستطيل بطريقة بدائية
ستكون النتيجة

يمكنك استخدام الخصائص الاخرى للدالة
فهي جد قوية ومساعدة

[/center]