![]() |
کمک در اندازه گیری طول و عرض یک شی در تصویر (باینری)
سلام خدمت همه دوستان گلم
از اونجایی که یک قسمت از پروژه من به image processing مروبوط میشه و من هم در این زمینه کاملا مبتدی هستم خواهشمند یاری دوستان حرفه ای در این زمینه هستم. من یکسری عکس از برگ های مختلف گیاهان دارم و باید توسط پردازش تصویر بصورت اتوماتیک مقدار طول و عرض اونارو اندازه بگیرم.مشکل اینجاست که من در این زمینه تخصص ندارم از دوستانی که میتونند کمک کنند ممنون میشم راهنمایی بگیرم. برای نمونه عکس زیر رو میزارم که بیشتر قابل درک باشه. [IMG]http://www5.picturepush.com/photo/a/...g/11693393.jpg[/IMG] email:mohamadalijan@gmail.com |
نقل قول:
1- با داشتن مختصات x,y کانتور یا همون پیرامون برگ ابتدا مرکز ثقل اون رو به دست بیارین که میشه مثلا xc,yc XX=X-xc YY=Y-yc 2- تمام مختصات x,y را از این مقدار کم کنید. در این صورت مرکز ثقل شما هم اکنون 0و0 خواهد شد. 3- ماتریس کواریانس آن را به دست بیاورید که ماتریسی 2*2 خواهد شد. در متلب تابعش هست cov یا [XX,YY]'*[XX,YY] را محاسبه کنید ' منظور ترانهاده است. XX,YY دو ماتریس n*1 هستند. با محاسبه بردارهای ویژه و مقادیر ویژه این ماتریس نهایی 2*2 جهت و مقدار بزرگی دو قطر موردنظر یافت می شود. |
reply
نقل قول:
|
X نشان دهنده مختصات x یا همون ستونهای پیکسل های پیرامونته که هست n*1
Y نشان دهنده مختصات y یا همون سطرهای پیکسل های پیرامونته که هست n*1 پس باید xc رو که میانگین x هاست از X کم کنی و همچنین yc رو که میانگین y هاست از Y کم کنی یعنی xc=mean(X) yc=mean(Y) XX=X-xc YY=Y-yc XX , YY بردارهای مربوط به xها و yهاست که الآن نرمالیزه شده اند و اگه میانگین اونها رو حساب کنی میشه 0و0 (zero mean) حالا یه ماتریس n*2 ایجاد می کنی به این صورت که ستون اولش x ها و ستون دومش yهاست یعنی [XX,YY] و کواریانس اونو حساب می کنی همون طوری که گفتم و بعدش بردارهای ویژه و مقادیر ویژشو تو متلب با eig که بهت بردار ویژه و مقادیر ویژه رو برمی گردونه یه راهی به نظرم رسید که ساده تره شاید، اینه که فاصله هر نقطه روی پیرامونو تا تک تک نقاط محاسبه کن که میشه با مرتبه زمانی n2 بعدش اون دونقطه ای که بیشترین فاصله رو دارند میشه همون قطر اصلیت و عمود بر این قطر میشه قطر دیگت. این روش شاید برای همه برگها جواب نده و خطا داشته باشه. باید تست کنی |
نقل قول:
من اون چیزی رو که از حرفات متوجه شدم انجام دادم ولی باز به نتیجه نرسیدم.نمیدونم شاید کار من مشکل داشته. برنامه رو میزارم اگه زحمتی نیست برات یه چک بکن ببین اشکال کار من کجاست. من یک بار اندازه طول و عرض رو با imtool گرفتم به ترتیب 377 و 305 و یک بارم توسط کدی که نوشتم که جواب هاش کلی با این عددها فرق داشت. در ضمن اونجایی که گفتی XX , YY بردارهای مربوط به xها و yهاست که الآن نرمالیزه شده اند و اگه میانگین اونها رو حساب کنی میشه 0و0 (zero mean)، من امتحان کردم zero mean نشد. clc clear all Image = imread('IM.jpg'); Image=imresize(Image,0.25); dImage = im2double(Image); logicalImage = im2bw(dImage, 0.75); BW=imcomplement(logicalImage); BW = bwareaopen(BW,30); BW2 = bwmorph(BW,'remove'); % get the contour [X Y]=find(BW2==1); xc=mean(X); yc=mean(Y); xx=X-xc; yy=Y-yc; r=[xx yy]; co=cov(r); [v d]=eig(co) اینم لینک عکس یک برگ برای نمونه http://s13.postimage.org/q70lk4u2f/image.jpg |
من کدتو دیدم کاملا درست بود. الآن xx,yy نرمالیزه شدند. من چک کردم میانگین صفر بودند یعنی خیلی نزدیک به صفر بود 12-^10
بعد یه پلات به کد اضافه کردم نتیجه رو ببینی. کدت کاملا صحیح بود من هیچ تغییری ندادم می تونی با v که جهتو نشون میده و d که یه ضریبی از مقدار طولشونه اون خطها رو رسم کنی. نتیجه خوبه clear all Image = imread('image.jpg'); Image=imresize(Image,0.25); dImage = im2double(Image); logicalImage = im2bw(dImage, 0.75); BW=imcomplement(logicalImage); BW = bwareaopen(BW,30); BW2 = bwmorph(BW,'remove'); % get the contour [X Y]=find(BW2==1); xc=mean(X); yc=mean(Y); xx=X-xc; yy=Y-yc; r=[xx yy]; co=cov(r); [v d]=eig(co); length_diam1=2*sqrt(d(1,1))*v(:,1); % the length of diameter length_diam2=2*sqrt(d(2,2))*v(:,2); % the length of diameter figure; plot(yy,xx,'.b'); hold on;plot([0,length_diam1(1)],[0,length_diam1(2)],'r'); hold on;plot([0,length_diam2(1)],[0,length_diam2(2)],'r'); |
من یکم تغییر دادم. لازم نیست پیرامون رو به دست بیاری. با همون تصویر دودویی شده (که پیکسلهای داخلی رو هم شامل میشه) نتیجه بهتره. برای تست می تونی تصویرو بچرخونی و کدو اجرا کنی دوباره
clc clear all close all Image = imread('image.jpg'); if(ndims(Image==3)) Image=rgb2gray(Image); end Image=imresize(Image,0.25); dImage = im2double(Image); logicalImage = im2bw(dImage, 0.9); BW=imcomplement(logicalImage); BW2 = bwareaopen(BW,30); %BW2 = bwmorph(BW,'remove'); % get the contour %% Rotation %BW2=imrotate(BW2,30); %% [rr cc]=find(BW2==1); Y=-rr; X=cc; xc=mean(X); yc=mean(Y); xx=X-xc; yy=Y-yc; co=cov([xx yy]); [v d]=eig(co); length_diam1=2*sqrt(d(1,1))*v(:,1); % the length of diameter length_diam2=2*sqrt(d(2,2))*v(:,2); % the length of diameter figure; plot(xx,yy,'.b'); hold on;plot([0,length_diam1(1)],[0,length_diam1(2)],'r'); hold on;plot([0,length_diam2(1)],[0,length_diam2(2)],'r'); xlim([-100,100]) ylim([-100,100]) |
دستت درد نکنه مهدی جان خیلی بهتر شده ولی یه مسئله ای که است مطابق اولین شکلی که من برا مثال ذکر کردم نیست منظورم اینکه این فقط قسمتی از این بردارهای متعامد رو رسم میکنه نه کلشو من میخوام این بردارها از هر طرف بروی شکل مماس باشن، مثلا من برنامه رو با 2 تا عکس مختلف کردم که بصورت زیر شد.
خط های زرد رو خودم اضافه کردم که ایدال منه و باید اینطوری رسم بشه. راستی اگه بشه مختصات این 4 نقطه رو که با مشکی مشخص کردم پیدا کنم هم میشه این کارو انجام داد،خواستم ببینم ایده ای تو این زمینه داری؟ View image: 1 View image: 2 |
نقل قول:
این کارو از طرف ستون هم انجام بده. یعنی پیکسلهای هر ستون رو با هم جمع بزن sum(image,1) و بعدش بیشینه بگیر |
نقل قول:
:3: |
خواهش می کنم من نگفتم این کارو برای تک تک تصاویر دستی انجام بدی. تو می تونی از همون بردارهای ویژه استفاده کنی و زاویه رو به دست بیاری. مثلا بردارهای ویژه ات اگه باشن (0.7071,0.7071) , (0.7071,0.7071-) ---> (x,y)
در این صورت tetta=atan2(v(2,2),v(1,2))*180/pi یعنی tetta=atan2(y,x)*180/pi که به همین اندازه می چرخونی در جهت منفی res_image=imrotate(BW2,-tetta); و بعد اون کارا رو می کنی اینم کدش clc clear all close all Image = imread('33.jpg'); if(ndims(Image==3)) Image=rgb2gray(Image); end %% %Image=imresize(Image,0.25); dImage = im2double(Image); logicalImage = im2bw(dImage, 0.9); BW=imcomplement(logicalImage); BW2 = bwareaopen(BW,30); %BW2 = bwmorph(BW,'remove'); % get the contour %% [rr cc]=find(BW2==1); Y=-rr; X=cc; xc=mean(X); yc=mean(Y); xx=X-xc; yy=Y-yc; co=cov([xx yy]); [v d]=eig(co); %%------------------------------------------------------------------------- length_diam1=2*sqrt(d(1,1))*v(:,1); % the length of diameter length_diam2=2*sqrt(d(2,2))*v(:,2); % the length of diameter figure; plot(xx,yy,'.b'); hold on;plot([0,length_diam1(1)],[0,length_diam1(2)],'r'); hold on;plot([0,length_diam2(1)],[0,length_diam2(2)],'r'); %%------------------------------------------------------------------------- xlim([-400,400]) ylim([-400,400]) %% %res_image=imcomplement(dImage); tetta=atan2(v(2,2),v(1,2))*180/pi; res_image=imrotate(BW2,-tetta); [row,col]=size(res_image); [mxc,indc]=max(sum(res_image,1)); [mxr,indr]=max(sum(res_image,2)); %%------------------------------------------------------------------------- p1.x=find(res_image(indr,:)==1,1); p1.y=indr; p2.x=col-find(res_image(indr,end:-1:1)==1,1)+1; p2.y=indr; p3.y=find(res_image(:,indc)==1,1); p3.x=indc; p4.y=row-find(res_image(end:-1:1,indc)==1,1)+1; p4.x=indc; figure;imshow(mat2gray((res_image))); %%------------------------------------------------------------------------- hold on;plot(p1.x,p1.y,'*','markersize',10); hold on;plot(p2.x,p2.y,'*','markersize',10); hold on;plot(p3.x,p3.y,'*','markersize',10); hold on;plot(p4.x,p4.y,'*','markersize',10); hold on;plot([p1.x,p2.x],[p1.y,p2.y],'--r'); hold on;plot([p3.x,p4.x],[p3.y,p4.y],'--r'); %%------------------------------------------------------------------------- |
سلام مهدی جان آقا من خیلی وقت نیومدم اینجا سر بزنم دستت درد نکنه کدت جواب داد و خیلی هم خوب جواب داد.همونطور که قبلا گفتم ای برا یه قسمت از پروژم بود، حالا باید روش انجام این کارو بطور ریاضی وار شرح بدم و از اونجایی که من پردازش تصویرم در سطح مبتدیه یه چندتا سوال داشتم .اگه زحمتی نیست برات یه کمکی به من بکن یا اگه وقت نداری چندتا رفرنس معرفی کن من بخونم.
1-چرا ما مرکز شکل رو مرکز مختصات قرار دادیم و بعد کواریانس گرفتیم؛نمیشد از همون X,Y کواریانس گرفت؟ Y=-rr;علامت منفی اینجا چه حکمی داره؟شکل رو نسبت به Y قرینه میکنه؟ X=cc; 2-میشه توضیح بدی در چطوری زاویه tetta رو با استفاده از بردار ویژه پیدا می کنی؟بصورت یه مثال ساده ریاضی وار tetta=atan2(v(2,2),v(1,2))*180/pi;آیا در دو بردار یک جواب رو میده؟یعنی فرق نمیکنه کدومو بزاریم؟ res_image=imrotate(BW2,-tetta);چرا tetta- باید باشه؟چرا در جهت مثبت نمی چرخونیم ؟ این زاویه tetta بین بردار ویژه و کدوم محوره، اینو لازم دارم چون برا 2تا از برگ ها زاویه رو درست بدست نیورده http://s18.postimage.org/uidawvct5/untitled1.png http://s16.postimage.org/wo6n1cdo5/untitled2.png |
درخواست راهنمایی
سلام
من دارم در مورد پیدا کردن ابعاد یک شکل (طول عرض ارتفاع ) تحقیق میکنم استادم دو حالت رو برای تحقیق بهم پیشنهاد داده یکی شی وقتی طولش از طول تصویر کمتر هست و دیگری زمانی که طول شی از طول تصویر بیشتر . استادم ازم خواسته که روشهای بدست آوردن طول شی در این دو حالت رو پیدا کنم . لطفا راهنماییم کنید از کجا باید شروع کنم من هیچ اطلاعاتی ندارم . راستی باید با #c پیاده سازی کنم چیزی رو که دنبالش هستم |
اگه دوست داری میتونی یه نمونه از اون عکس برگهاتو بذاری . فکر میکنم خیلی ساده تر از اینها بتونی اون کارهایی رو که میخوای بشه انجام داد :)
|
من متوجه نشدم! طول شی که از طول تصویر کمتر است بیشتر است؟!!!
واضح توضیح بدین! |
زمان محلي شما با تنظيم GMT +3.5 هم اکنون ۰۶:۴۸ بعد از ظهر ميباشد. |
Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.1.0 ©2007, Crawlability, Inc.