PDA

View Full Version : نوشتن برنامه ای برای استخراج خصوصیات فیزیکی از یک تصویر با پردازش تصویر در متلب



nadaf.m
جمعه 13 تیر 1393, 00:20 صبح
با سلام
عنوان پروژه من راجع به نوشتن برنامه ای برای استخراج خصوصیات فیزیکی از یک تصویر با پردازش تصویر در متلب هست. که این تصویر در حال حاضر تصویر یک هندوانه هست.(لازم به ذکره که این تصویر هندوانه شبیه یک بیضی هست )می بایست در این برنامه چندین تصویر در حلقه ای مثل for خوانده بشه و هم چنین برای هر کدام به صورت مجزا یک سری پارامترها مثل مساحت،محیط،حجم،مساحت دایره محیطی ومحاطی آن،طول بزرگ و کوچک تصویر ،ضریب کرویت ،شعاع انحنا ،رنگ و میانگین rgb همه تصاویر و.... محاسبه و نمایش داده بشه. در حال حاضر به یک سری دستورات برای اجرای چنین برنامه ای نیاز دارم. باید بگم که یه آشنایی جزیی از متلب دارم و خیلی نا آشنا نیستم .ممنون از توجه و راهنمایی هاتون. یا علی

rahnema1
جمعه 13 تیر 1393, 17:13 عصر
سلام
همین طور که اشاره کردید شما با متلب کمی آشنایی دارید.
فرض کنید یک ماتریس داریم که اعداد داخل اون شامل اعداد 1 تا 255 باشند حالا می خواهیم اون خانه هایی از ماتریس را جدا کنیم که عدد اونها برابر مثلا 30 باشند چیکار باید بکنیم؟
خب اگه این را بدونید در ادامه کار شما راحت تر خواهد شد. از اینجا شروع کنید

nadaf.m
جمعه 13 تیر 1393, 18:43 عصر
با سلام
عنوان پروژه من راجع به نوشتن برنامه ای برای استخراج خصوصیات فیزیکی از یک تصویر با پردازش تصویر در متلب هست. که این تصویر در حال حاضر تصویر یک هندوانه هست.(لازم به ذکره که این تصویر هندوانه شبیه یک بیضی هست )می بایست در این برنامه چندین تصویر در حلقه ای مثل for خوانده بشه و هم چنین برای هر کدام به صورت مجزا یک سری پارامترها مثل مساحت،محیط،حجم،مساحت دایره محیطی ومحاطی آن،طول بزرگ و کوچک تصویر ،ضریب کرویت ،شعاع انحنا ،رنگ و میانگین rgb همه تصاویر و.... محاسبه و نمایش داده بشه. در حال حاضر به یک سری دستورات برای اجرای چنین برنامه ای نیاز دارم. باید بگم که یه آشنایی جزیی از متلب دارم و خیلی نا آشنا نیستم .ممنون از توجه و راهنمایی هاتون. یا علی


میشه یه مقدار بیشتر توضیح بدید.....می خواستم بدونید مشکل اساسی من در رابطه با پیدا کردن دستوراتی برای یافتن پارامترهایی هست که قبلا گفتم ..ببینید فرض کنید یک تصویری از بیضی وجود داره و ما میخواهیم دایره محیطی و محاطی بیضی رو رسم کنیم و همین طور مساحتشون رو بدست بیاریم. و همین طور پارامترهای دیگه ای مثل اندازه طول بزرگ و کوچک بیضی و ضریب کرویت و.....
میشه لطف کنید دستورات لازم برای بدست آوردن چنین پارامتر هایی رو بهم بگید.
خیلی ممنون..........

rahnema1
جمعه 13 تیر 1393, 21:00 عصر
واسه اینکه بتونید مساحت و حجم و .. را به دست بیارید ابتدا باید هندونه را از تصویر بکشید بیرون واسه همین میگم باید بتونید مقدار یک عدد را از یک ماتریس بتونید استخراج کنید
هندونه رنگش سبزه و ممکنه محیط اطراف هندونه به یک رنگ دیگه باشه بنابراین مقدار ماتریس اونها هم متفاوته شما اولا هندونه را باید بتونید بکشید بیرون از همین جا شروع کنید تا برسیم به مراحل بعدی

nadaf.m
شنبه 14 تیر 1393, 11:53 صبح
راستش تا حالا تونستم هندونه رو از تصویر زمینه جدا کنم و مساحت و محیط و حجم و یه سری دیگه از پارامترهای جزئی رو بدست بیارم اما در حال حاضر یه دستور برای رسم و محاسبه مساحت دایره محیطی و محاطی این هندونه و طول بزرگ و طول کوچکش رو احتیاج دارم.....و بعد از این پارامترهای دیگه رو باید بدست بیارم. لطفا کمکم کنید......ممنون

rahnema1
شنبه 14 تیر 1393, 13:27 عصر
خب کد خودتون را بذارید اینجا تا بر اساس اون بقیه چیزها را به دست بیاریم

nadaf.m
شنبه 14 تیر 1393, 15:36 عصر
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%

nadaf.m
شنبه 14 تیر 1393, 15:39 عصر
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%

nadaf.m
شنبه 14 تیر 1393, 15:39 عصر
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%

rahnema1
شنبه 14 تیر 1393, 21:34 عصر
شما که ماشالله خوب کد می زنی این که دیگه کاری نداره ( اگه هندونه ها همشون افقی باشن)

I=imread('1.jpg');
I1=rgb2gray(I);
labe1= edge(I1,'roberts');
labe=zeros(size(I1,1),size(I1,2));
labe(2:end-1,2:end-1)=labe1(2:end-1,2:end-1);
x=repmat(1:size(I1,2),size(I1,1),1);
y=repmat(1:size(I1,1),size(I1,2),1)';
y=repmat(size(I1,1):-1:1,size(I1,2),1)';

index=find(labe==1);
labex=x(index);
labey=y(index);

toolbozorg=max(labex)-min(labex);
toolkoochek=max(labey)-min(labey);

x1bozorg=min(labex);%mean(labex(labex==min(labex)) );
y1bozorg=mean(labey(labex==x1bozorg));
y1koochek=min(labey);%mean(labex(labey==min(labey) ));
x1koochek=x1bozorg+toolbozorg/2;

drawcircle(x1bozorg+toolbozorg/2,y1bozorg,toolbozorg/2);
hold on
imshow(I);
drawcircle(x1bozorg+toolbozorg/2,y1bozorg,toolbozorg/2);
drawcircle(x1koochek,y1koochek+toolkoochek/2,toolkoochek/2);

nadaf.m
یک شنبه 15 تیر 1393, 00:40 صبح
خیلی ممنون از لطفتون و راهنمایی هاتون .....
ببینید توی دستوری که گفتید ،دستور draw circle برای متلب ناشناخته هست و خطای زیر رو میده:
Undefined function 'drawcircle' for input arguments of type 'double'.
اتفاقا توی هلپ متلپ که جستجو کردم ،خیلی تلاش کردم دستوری مشابه پیدا کنم مثل pdecircle یا circle یا حتی viscirclel اما باز نتیجه ای ندادند و خطا میداد، یا اگر چیزی نشون میداد کاملا بی ربط با چیزی که می خواستم بود.لطفا میشه اگه دستور جایگزینی مد نظرتون هست بهم بگید....
با نهایت سپاس از همراهیتون.....

rahnema1
یک شنبه 15 تیر 1393, 08:48 صبح
از این سایت گرفتم
blog.ubifeel.com/?p=54


function drawcircle(xc, yc, r)
t = [0:0.1:2*pi];
x = r * cos(t);
y = r * sin(t);
plot(x + xc, y + yc);
end

nadaf.m
یک شنبه 15 تیر 1393, 16:16 عصر
تو سایتی که گفتید رفتم ،اما متاسفانه اونجا هم به نتیجه ای نرسیدم.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%

nadaf.m
یک شنبه 15 تیر 1393, 16:36 عصر
بازم بابت کمکتون تشکر میکنم...اما مشکلی که پیش اومد این بود که این قسمت آخری برنامه یعنی همین رسم دایره های محیطی و محاطی و....ومحاسبات مربوط به اونها . با توجه به این ضریب حساسیت 0.99455 فقط برای تصویر اول نتیجه داد .یعنی برای مابقی تصاویر این ضریب متفاوت هست ...یا حتی مقدار بازه ی
Rminو Rmax
هم برای هر تصویر باید متفاوت باشه تا نتیجه بده.حالا به نظرتون باید چه کار کنم تا این قسمت هم برای همه ی تصاویر نتیجه بده.یا مثلا چه چیزی رو باید داخلش تغییر بدم؟؟؟؟؟
یه سوال دیگه ای که دارم این هست که:به نظرتون مقدار شعاع دایره محیطی طبق این دستورات جدید درسته(در قسمت مرکز1 و شعاع 1)؟؟؟؟
البته من حساب که کردم درست نبود!!!!!باید چی کار کنم؟؟؟؟
لطفا کمکم کنید.....ممنون

rahnema1
یک شنبه 15 تیر 1393, 23:04 عصر
اگه بتونید کدها را داخل تگ بذارید شکل بهتری پیدا می کنه
من فرض کردم همه شکل ها به صورت بیضی افقی هست مثل همون هندونه. نمیدونم شکل های دیگه به چه صورتی هست.

nadaf.m
یک شنبه 15 تیر 1393, 23:27 عصر
منظورتون رو متوجه نمیشم!!!یعنی دقیقا باید چی کار کنم.منظورتون از تگ چیه؟؟؟(فرضتون هم صحیح هست،یعنی همه تصاویر تقریبا شکلی شبیه بیضی دارندو افقی هستند ،منتهی با یه مقدار تغییرات جزیی...)

rahnema1
دوشنبه 16 تیر 1393, 00:10 صبح
http://www.sharefile.ir/uploads/1404776773.png

rahnema1
دوشنبه 16 تیر 1393, 00:21 صبح
این دو تصویری که فرستادین به این صورت میشه با اون برنامه که نوشتم. بیضی کامل نیستند
http://www.sharefile.ir/uploads/1404720806.zip

nadaf.m
دوشنبه 16 تیر 1393, 12:53 عصر
درسته!!با اجرای برنامه به همین صورتی که تصاویر رو فرستادین ،دایره هاشون رسم میشه.خداروشکر فعلا این مشکل دایره ها به لطف شما حل شده!!! اما یه مسئله ی دیگه ای که هست،اینه که دستورات باینری کردن به صورت یکنواخت روی تصاویر دیگه جواب نمیده ،منظورم اینه که کاملا سطح هندونه سفید نمیشه و این به خاطر عدم یکنواختی سطحش هست!!!و همون طور که میدونید این قضیه روی محاسبه پارامترهایی مثل مساحت و محیط و ضریب گردی و.... تاثیر میزاره!!!!به نظرتون باید از چه دستوراتی استفاده کنم تا تصویر هندونه به هر صورتی که هست ،زمانی که باینری میشه سطحش کاملا سفید شه!!!!ویا برای اندازه گیری محیط فقط لبه هاش باقی بمونن!!!ببینید میدونم که میشه از دستورات حذف نویز هم استفاده کرد،اما واقعیت اینه که یه مقدار گیج شدم و نمیدونم دقیقا باید از کدوم دستوراتش استفاده کنم.میشه لطف کنید یه مقدار دقیق تر توضیح بدید.ممنون

rahnema1
دوشنبه 16 تیر 1393, 18:01 عصر
از روش سوبل استفاده کنید
مثلا مساحت این جور به دست میاد

I=imread('8.jpg');
I1=rgb2gray(I);
labe1= edge(I1,'sobel');
labe=zeros(size(I1,1),size(I1,2));
labe(2:end-1,2:end-1)=labe1(2:end-1,2:end-1);
x=repmat(1:size(I1,2),size(I1,1),1);
y=repmat(size(I1,1):-1:1,size(I1,2),1)';

labey1=y.*labe;
labey1(labey1==0)=1.5;
masahat=sum(max(labey1)-min(labey1))

برای اینکه داخل محدوده کاملا سفید بشع مینیمم و ماکزیمم مختصات هر ستون را پیدا کنید و بین اون را رنگ سفید کنید

nadaf.m
دوشنبه 16 تیر 1393, 23:24 عصر
میشه یه مقدار بیشتر راجع به برنامه ای که فرستادید توضیح بدید مخصوصا از خط 5 به بعد....یعنی دقیقا چه اتفاقی برای تصویر میفته؟؟و اینکه چه طوری باید ماکزیمم ومینیمم مختصات هر ستون رو پیدا کرد و بین اون رو رنگ سفید کرد؟؟؟لطفا اگه امکانش هست به صورتی توضیح بدید که بتونم با اجرای دستورات تصویرشو ببینم!!!

rahnema1
سه شنبه 17 تیر 1393, 11:22 صبح
ffoadn اون کد مساحت را اشتباه حساب می کرد این یکی داخل هندونه را سفید می کنه و مساحت می گیره
خودتون خط به خط کدها را خروجی بگیرین ببنید محتویاتش چیه
مختصات را با repmat به دست میاریم

I=imread('8.jpg');
I1=rgb2gray(I);
labe1= edge(I1,'sobel');
labe=zeros(size(I1,1),size(I1,2));
labe(2:end-1,2:end-1)=labe1(2:end-1,2:end-1);
x=repmat(1:size(I1,2),size(I1,1),1);
y=repmat(1:size(I1,1),size(I1,2),1)';

labey1=y.*labe;
mx=max(labey1);
labey1(labey1==0)=max(mx);
mn=min(labey1);
idxmx=find(mx~=0);
idxmn=find(mn~=max(mx));
idxmnmx=intersect(idxmn,idxmx);
segment=zeros(size(I1,1),size(I1,2));
for i=idxmnmx
segment(mn(i):mx(i),i)=1;
end
masahat=sum(segment(:))
imshow(segment)


http://www.sharefile.ir/uploads/1404860527.png

nadaf.m
سه شنبه 17 تیر 1393, 16:34 عصر
با نهایت سپاس از کمک و توجهتون...
بعد از اجرای کدتون یک سری خطوط سیاه در سطح هندونه ایجاد میشه!!یعنی حتی روی تصویر اول که هیچ مشکلی نداشت هم یه سری خطوط سیاه رنگ ایجاد میکنه!!!خیلی تلاش کردم مشکلشو رفع کنم اما بی فایده بود ،از فیلتر هم استفاده کردم اما اثری نداشت!!!به نظرتون چه جوری باید مانع از ایجاد این خطوط شد و یا حذفشون کرد!!؟؟؟!

rahnema1
سه شنبه 17 تیر 1393, 16:53 عصر
به همراه فیلتر سوبل این را بذارید. اگه فایده نداشت همین طور که از بالا به پایین داخل هندونه را سفید کردیم باید از چپ به راست هم همین کار را انجام بدیم

I=imread('1.jpg');
I1=rgb2gray(I);
labe1= edge(I1,'sobel');
labe1=bwmorph(labe1,'bridge',5);
labe=zeros(size(I1,1),size(I1,2));
labe(2:end-1,2:end-1)=labe1(2:end-1,2:end-1);
x=repmat(1:size(I1,2),size(I1,1),1);
y=repmat(1:size(I1,1),size(I1,2),1)';

labey1=y.*labe;
mx=max(labey1);
labey1(labey1==0)=max(mx);
mn=min(labey1);
idxmx=find(mx~=0);
idxmn=find(mn~=max(mx));
idxmnmx=intersect(idxmn,idxmx);
segment=zeros(size(I1,1),size(I1,2));
for i=idxmnmx
segment(mn(i):mx(i),i)=1;
end
masahat=sum(segment(:))
imshow(segment)

nadaf.m
چهارشنبه 18 تیر 1393, 01:17 صبح
بازم بابت راهنمایی های مفیدتون تشکرمیکنم...خداروشکر از یه روش دیگه استفاده کردم که خیلی خوب جواب داد!!!فقط برای یادگیری بیشتر می خواستم ازتون بپرسم چه جوری میشه از چپ به راست هم سطح هندونه رو سفید کرد؟؟؟؟!!!و کلا ترکیب دستوراتش با حالت از بالا به پایین به چه شکل میشه؟؟؟!!ویه سوال اساسی دیگه ای که از خدمتتون دارم این هست که پارامتر محیط رو به چه صورت میشه به صورت صحیح بدست آورد؟؟!!

rahnema1
چهارشنبه 18 تیر 1393, 11:13 صبح
فقط برای یادگیری بیشتر می خواستم ازتون بپرسم چه جوری میشه از چپ به راست هم سطح هندونه رو سفید کرد؟؟؟؟!!!و کلا ترکیب دستوراتش با حالت از بالا به پایین به چه شکل میشه؟؟؟!!

خیلی راحته اگه تونستید پیدا کنید یه جایزه پیش من دارید



ویه سوال اساسی دیگه ای که از خدمتتون دارم این هست که پارامتر محیط رو به چه صورت میشه به صورت صحیح بدست آورد؟؟!!


seg1=bwmorph(segment,'majority',5);
border=seg1-bwmorph(seg1,'erode');
mohit=sum(border(:))
imshow(border)

اگه امکان داره بگید از چه روشی داخل هندونه را پر کردید

nadaf.m
پنج شنبه 19 تیر 1393, 02:08 صبح
راستش در مورد ترکیب این دستورات( از بالا به پایین و چپ به راست) که گفتید ،فکر میکنم کدی که براتون فرستادم ،قسمت بیشترش تکمیل هست و فقط احتیاج به یه اصلاح کوچولو داره!!!!ولی اگه میشه یه مقدار بهم فرصت بدید تا اون کد الگوی چپ به راست رو پیدا کنم!!همون طور که گفتید من هم احساس میکنم باید کد ساده ای باشه!!!ولی لطف کنید اگه از نظرتون این کد خیلی اشتباه هست،بهم بگید!!!! (ولی من تستش کردم بد جواب نمیداد!!!)


I=imread('8.jpg');
I1=rgb2gray(I);
labe1= edge(I1,'sobel');
labe1=bwmorph(labe1,'bridge',5);
labe=zeros(size(I1,1),size(I1,2));
labe(2:end-1,2:end-1)=labe1(2:end-1,2:end-1);
x=repmat(1:size(I1,2),size(I1,1),1);
y=repmat(1:size(I1,1),size(I1,2),1)';
z=rot90(y,2);
labey1=y.*labe;
labex1=z.*labe;
mx1=max(labey1);
mx2=max(labex1);
labey1(labey1==0)=max(mx1);
labex1(labex1==0)=max(mx2);
mn1=min(labey1);
mn2=min(labex1);
idxmx1=find(mx1~=0);
idxmx2=find(mx2~=0);
idxmn1=find(mn1~=max(mx1));
idxmn2=find(mn2~=max(mx2));
idxmnmx1=intersect(idxmn1,idxmx1);
idxmnmx2=intersect(idxmn2,idxmx2);
segment1=zeros(size(I1,1),size(I1,2));
segment2=zeros(size(I1,1),size(I1,2));
for i=idxmnmx1
segment1(mn1(i):mx1(i),i)=1;
end

for i=idxmnmx2
segment2(mn2(i):mx2(i),i)=1;
end
img_3=imadd(segment1,segment2);
figure,
imshow(img_3);
masahat=sum(img_3(:))

nadaf.m
پنج شنبه 19 تیر 1393, 02:15 صبح
ببخشید من نتونستم از این تگ که گفتید درست استفاده کنم.
اما باید بگم که ،کد خودتون رو با یه ذره تغییر کوچیک تونستم واسه اکثر تصاویر کاربردیش کنم ،منظورم این هست که سطح اکثر هندونه ها سفید میشه،که تنها تغییرش توی خط 4ام بود و به صورت زیر شد:



labe1=bwmorph(labe1,'dilate',13);

nadaf.m
پنج شنبه 19 تیر 1393, 02:19 صبح
و در آخر ضمن تشکر از کمک های خوب شما........
کدی که گفتم برای همه ی تصاویرخیلی خوب جواب داد به صورت زیر هست:





close all
clc
clear all
fontSize = 13;
p=imread('8.jpg');
v = rgb2gray(p);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
hy = fspecial('sobel');
hx = hy';
Iy = imfilter(double(v), hy, 'replicate');
Ix = imfilter(double(v), hx, 'replicate');
gradmag = sqrt(Ix.^2 + Iy.^2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
L = watershed(gradmag);
Lrgb = label2rgb(L);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
se = strel('disk', 50);
Io = imopen(v, se);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Ie = imerode(v, se);
Iobr = imreconstruct(Ie, v);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Ioc = imclose(Io, se);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Iobrd = imdilate(Iobr, se);
Iobrcbr = imreconstruct(imcomplement(Iobrd),imcomplement(Iob r));
Iobrcbr = imcomplement(Iobrcbr);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fgm = imregionalmax(Iobrcbr);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
I2 = v;
I2(fgm) = 255;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
se2 = strel(ones(5,5));
fgm2 = imclose(fgm, se2);
fgm3 = imerode(fgm2, se2);
fgm4 = bwareaopen(fgm3, 20);
I3 = v;
I3(fgm4) = 255;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bw = im2bw(Iobrcbr, graythresh(Iobrcbr));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bw=~bw;
figure, subplot(1,1,1);
imshow(bw), title('tasvire baynere shodeh')

nadaf.m
پنج شنبه 19 تیر 1393, 02:41 صبح
شرمنده !!!یه سوال دیگه داشتم:اینکه به نظرتون زمانی که سطح هندونه کلا سفید شد و بعد از یه مقدار تغییرات روی تصویر، حالتی بوجود میاد که فقط لبه های هندونه باقی می مونند :(یعنی یه تصویر کلا سیاه اما با لبه های سفید هندونه.)اون موقع میشه از دستور bw area برای بدست آوردن محیط استفاده کرد؟؟؟!!!آخه من تصورم این هست که این دستور فقط کار شمردن پیکسل های سفید رو انجام میده!!!!و این طوری محیط برحسب پیکسل بدست میاد!!!؟!!!!!!!

rahnema1
پنج شنبه 19 تیر 1393, 05:18 صبح
راستش در مورد ترکیب این دستورات( از بالا به پایین و چپ به راست) که گفتید ،فکر میکنم کدی که براتون فرستادم ،قسمت بیشترش تکمیل هست و فقط احتیاج به یه اصلاح کوچولو داره!!!!ولی اگه میشه یه مقدار بهم فرصت بدید تا اون کد الگوی چپ به راست رو پیدا کنم!!همون طور که گفتید من هم احساس میکنم باید کد ساده ای باشه!!!ولی لطف کنید اگه از نظرتون این کد خیلی اشتباه هست،بهم بگید!!!! (ولی من تستش کردم بد جواب نمیداد!!!)


لازم نبود rotate کنید دو تصویر segment را ببینید یکیش کله پا شده در ضمن از چپ به راست هم پر نشده از لبه پیکسل ها معلومه از بالا به پایین پر شده

rahnema1
پنج شنبه 19 تیر 1393, 05:22 صبح
شرمنده !!!یه سوال دیگه داشتم:اینکه به نظرتون زمانی که سطح هندونه کلا سفید شد و بعد از یه مقدار تغییرات روی تصویر، حالتی بوجود میاد که فقط لبه های هندونه باقی می مونند :(یعنی یه تصویر کلا سیاه اما با لبه های سفید هندونه.)اون موقع میشه از دستور bw area برای بدست آوردن محیط استفاده کرد؟؟؟!!!آخه من تصورم این هست که این دستور فقط کار شمردن پیکسل های سفید رو انجام میده!!!!و این طوری محیط برحسب پیکسل بدست میاد!!!؟!!!!!!!

حرف شما کاملا درسته ولی به bwarea نمیشه محیط بدست آورد باید فاصله بین دو پیکسل مجاور که روی لبه هستند را برای تمام اون پیکسل ها محاسبه کنید و با هم جمع بزنید دو پیکسلی که ضلع مشترک دارند فاصله 1 و دو پیکسلی که از گوشه به هم چسبیدند فاصله رادیکال 2 دارند.

rahnema1
پنج شنبه 19 تیر 1393, 05:26 صبح
ببخشید من نتونستم از این تگ که گفتید درست استفاده کنم.
اما باید بگم که ،کد خودتون رو با یه ذره تغییر کوچیک تونستم واسه اکثر تصاویر کاربردیش کنم ،منظورم این هست که سطح اکثر هندونه ها سفید میشه،که تنها تغییرش توی خط 4ام بود و به صورت زیر شد:



labe1=bwmorph(labe1,'dilate',13);


این یه کم میتونه خطرناک بشه . واسه اینکه از حاشیه های هنونه هم مساحت را بالا می بره

nadaf.m
پنج شنبه 19 تیر 1393, 12:55 عصر
یعنی این bwarea حتی مساحت رو هم صحیح نمیده !!!؟(ولی مگه دستور تعریف مساحت نیست؟؟؟!!)پس یعنی همیشه باید از دستور sumبرای شمردن پیکسل ها جهت بدست آوردن پارامترا استفاده کنیم.!!!!!!؟

nadaf.m
پنج شنبه 19 تیر 1393, 12:59 عصر
لازم نبود rotate کنید دو تصویر segment را ببینید یکیش کله پا شده در ضمن از چپ به راست هم پر نشده از لبه پیکسل ها معلومه از بالا به پایین پر شده

البته باید بگم: متوجه بودم که این کد تصویر رو وارون میکنه !!!و فقط پرسیدم که ترکیبش درست هست یا نه؟؟!!و اصلا منظورم این نبود که این الگویی برای چپ به راست هست!!!!!!!!!!!!!!!

rahnema1
پنج شنبه 19 تیر 1393, 14:19 عصر
یعنی این bwarea حتی مساحت رو هم صحیح نمیده !!!؟(ولی مگه دستور تعریف مساحت نیست؟؟؟!!)پس یعنی همیشه باید از دستور sumبرای شمردن پیکسل ها جهت بدست آوردن پارامترا استفاده کنیم.!!!!!!؟

به درد محاسبه محیط که نمی خوره هیچ حالا که به الگوریتمش در هلپ متلب نگاه کردم به درد محاسبه مساحت هم نمی خوره.(فکر کنم برای کاربردهای خاصی باشه).
همون sum مناسبترین روشه برای محاسبه مساحت

nadaf.m
جمعه 20 تیر 1393, 00:45 صبح
درمورد اون کد الگوی چپ به راست:راستش خیلی تلاش کردم و همین طور جستجو.....اما....متاسفانه نشد به چیزی که هدف اصلی بود برسم!!!البته توی این مدت برای رسیدن به این الگو فقط تونستم تصویر رو در حالت الگوی از بالا به پایین یه مقدار بیشتر یکدست و سفیدترش کنم !!!!اما خب این چیزی نبود که بخواد کمکی برای الگوی چپ به راست باشه!!!در کل می خواستم بگم که چون این موضوع خیلی ذهنمو درگیر کرده ،خواهش میکنم لطف کنید،اگه امکانش هست کد صحیحش رو بهم بگید!!!!!!!!!!!ممنون میشم.

rahnema1
جمعه 20 تیر 1393, 11:49 صبح
labex1=x.*labe;
mx1=max(labex1,[],2);
labex1(labex1==0)=max(mx1);
mn1=min(labex1,[],2);
idxmx1=find(mx1~=0);
idxmn1=find(mn1~=max(mx1));
idxmnmx1=intersect(idxmn1,idxmx1);
segment1=zeros(size(I1,1),size(I1,2));
for i=idxmnmx1'
segment1(i,mn1(i):mx1(i))=1;
end
imshow(segment1)

nadaf.m
جمعه 20 تیر 1393, 12:40 عصر
بابت همه ی کمک ها و راهنمایی های مفیدتون، تشکر میکنم .امیدوارم همیشه موفق و پیروز باشید.

nadaf.m
جمعه 20 تیر 1393, 12:45 عصر
labex1=x.*labe;
mx1=max(labex1,[],2);
labex1(labex1==0)=max(mx1);
mn1=min(labex1,[],2);
idxmx1=find(mx1~=0);
idxmn1=find(mn1~=max(mx1));
idxmnmx1=intersect(idxmn1,idxmx1);
segment1=zeros(size(I1,1),size(I1,2));
for i=idxmnmx1'
segment1(i,mn1(i):mx1(i))=1;
end
imshow(segment1)




خیلی ممنون.واقعا جالب بود!!فقط خواستم بدونید که ترکیب این دو الگو باز هم نتونست تمام خطوط سیاه رو سفید کنه و این به خاطر اشتراک دو الگو روی بعضی از خطوط سیاه بود. ولی در کل روی بعضی از تصاویر خوب جواب میداد.

rahnema1
جمعه 20 تیر 1393, 14:50 عصر
خیلی ممنون.واقعا جالب بود!!فقط خواستم بدونید که ترکیب این دو الگو باز هم نتونست تمام خطوط سیاه رو سفید کنه و این به خاطر اشتراک دو الگو روی بعضی از خطوط سیاه بود. ولی در کل روی بعضی از تصاویر خوب جواب میداد.

شما می تونید نتیجه این را با graythresh ترکیب کنید تا نتیجه بهتر بشه
یا تصویر را به فضای hsv ببرید روی مولفه h ترشولد بزنید

h=uint8(rgb2hsv(I)(:,:,1)*255);
imshow(im2bw(h,graythresh(h)))

nadaf.m
دوشنبه 30 تیر 1393, 13:49 عصر
با سلام مجدد...
ببخشید یه سوالی از خدمتتون داشتم:اینکه چه جوری میشه در انتهای برنامه ،تمام نتایجی که از پارامترها برای تمام تصاویر بدست آوردیم رو توی یه جدول در متلب نمایش بدیم!!!؟من فقط تونستم با استفاده از دستور subplot با نمایش تصاویرشون نتایج رو نمایش بدم!!ویه سوال دیگه اینکه: در متلب امکانش هست با دادن یه تصویر، بشه گفت رنگش به چه صورت هست؟!! (منظورم اینه که بتونیم کدی بنویسیم که مشخص کنه دقیقا رنگ هندونه به چه صورت هست؟!!)

rahnema1
دوشنبه 30 تیر 1393, 14:13 عصر
حالا حتما لازمه جدول کشیده بشه؟ نمیشه مثلا نتایج را برای داخل ورد و مرتب کنی؟
در مورد سوال دوم اگخ منظورتون اینه که رنگ غالب به دست بیاد می تونید هیستوگرام تصویر را به دست بیارید و مقداری که بیشترین تکرار را داره رنگ غالب تصویر محسوب میشه

nadaf.m
دوشنبه 30 تیر 1393, 15:19 عصر
میدونید اگه بشه توی اکسل مرتبش کرد خیلی بهتره!!ولی نمیدونم چه جوری باید این کار رو کرد!اگه توی اکسل نمیشه ،میشه توضیح بدید چه جوری میشه تو ورد نشونشون داد؟؟!
اما در مورد رنگ ،مثلا برای یک تصویر ،هیستوگرامش به صورت زیر شده!!منظورتون رو متوجه نمیشم که گفتید :(مقداری که بیشترین تکرار را داره رنگ غالب تصویر محسوب میشه).مثلا برای این هیستوگرام رنگ رو چه جوری میشه مشخص کرد؟؟


121358

rahnema1
دوشنبه 30 تیر 1393, 15:22 عصر
ضمیمه لینکش خرابه کار نمی کنه

nadaf.m
دوشنبه 30 تیر 1393, 15:32 عصر
121360 تونستید ببینیدش؟اگه نشد،پس چه جوری نشونتون بدم!!!؟؟باید چی کار کرد؟

rahnema1
دوشنبه 30 تیر 1393, 15:36 عصر
نمودارش منظورم نیست ببینید اول شما باید بتونید هندونه را استخراج کنید و فقط هیستوگرام اون جایی را به دست بیارید که شامل هندونه میشه
نمودار از روی یک سری اعداد تهیه میشه حالا توی این نمودار مقدار آخر بیشترین تکرار را داره

nadaf.m
دوشنبه 30 تیر 1393, 15:47 عصر
ببینید من از همون اول مشکل داشتم که چه جوری میشه هندونه رو از تصویر کلا جدا کرد!!؟و مگه برای رسم هیستوگرام نباید اول تصویر رو به فرمت خاکستری تبدیل کرد و بعد با استفاده از اون نمایشش داد!!پس اگه به این صورت باشه نمیشه با هیستوگرام با استفاده از شدت مقدار، رنگ رو مشخص کرد!!یا حتی اگه هیستوگرامش رسم شه دیگه اون شدت رنگ واقعی تصویر رو نشون نمیده!!!

rahnema1
دوشنبه 30 تیر 1393, 16:08 عصر
ما با استفاده از انواع ترفندها تونستیم یک تصویر سیاه و سفید از هندونه ( منظورم که سطح هندونه سفید و بقیه سیاه) درست کنیم
حالا ما تصویر اصلی را می گیریم و می گیم هر چا که تصویر هندونه سیاه وسفید برابر 1 بود پیکسلهای هندونه را استخراج کن مثلا تصویر 3 رنگ برابر I باشه و هندونه سیاه و سفید هم I2 باشه

Ih=reshape(I,prod(size(I))/3,3);
Ih=Ih(logical(I2),:);
subplot(1,3,1),hist(Ih(:,1));
subplot(1,3,2),hist(Ih(:,2));
subplot(1,3,3),hist(Ih(:,3));

nadaf.m
دوشنبه 30 تیر 1393, 16:46 عصر
با جایگذاری imhist به جای hist سه تا هیستوگرام رسم شد.به نظرتون این دو کد با هم فرق دارن؟آخه وقتی از hist استفاده می کردم ،خطا میداد وچیزی نمایش نمیداد!به هرحال می خواستم بپرسم یعنی الان این سه نمودار نمایش شدت رنگ آبی و قرمز و سبز قسمت مربوط به هندونه هست؟ و این طوری با توجه به مقدار max هر مولفه نشون داده میشه که کدوم مولفه در تصویر فقط هندونه (منظورم همون هندونه جدا شده هست) بیشتر دخیل هست!!

rahnema1
دوشنبه 30 تیر 1393, 16:58 عصر
[c,x]=imhist...
اینجا ببینید در کدوم x مقدار c برابر با حداکثر میشه

nadaf.m
دوشنبه 30 تیر 1393, 17:15 عصر
نمیدونم منظورتون دقیقا چی بود اما به صورت زیر که اجراش کردم در x=14 مقدار c حداکثر شد!!

[c,x]=imhist(Ih)


خب حالا یعنی چی شد!!میشه بیشتر توضیح بدید!

rahnema1
دوشنبه 30 تیر 1393, 17:21 عصر
نمیدونم منظورتون دقیقا چی بود اما به صورت زیر که اجراش کردم در x=14 مقدار c حداکثر شد!!

[c,x]=imhist(Ih)


خب حالا یعنی چی شد!!میشه بیشتر توضیح بدید!

سه تا x به دست میاد یکی برای قرمز یکی برای سبز و یکی برای آبی
ترکیب این سه تا رنگ غالب تصویر را نشان میده

nadaf.m
دوشنبه 30 تیر 1393, 18:00 عصر
منظورتون اینه که اگه برای هر مولفه این کد رو بزنیم برای هر یک x یه مقدار c بدست میاد و باید برای هرمولفه ، x ای رو در نظر گرفت که در آن مقدار c حداکثر شده باشه!!اینطوری اون سه تا x ای که میگید بدست میاد؟

rahnema1
دوشنبه 30 تیر 1393, 18:24 عصر
منظورتون اینه که اگه برای هر مولفه این کد رو بزنیم برای هر یک x یه مقدار c بدست میاد و باید برای هرمولفه ، x ای رو در نظر گرفت که در آن مقدار c حداکثر شده باشه!!اینطوری اون سه تا x ای که میگید بدست میاد؟

بله درسته همین طوره

nadaf.m
دوشنبه 30 تیر 1393, 18:42 عصر
الان چه جوری این سه تا x رو باید ترکیب کرد تا رنگ غالبی که میگید مشخص شه!!؟ویا اینکه فقط میتونیم با توجه به مقدار c مولفه ای که از دو مقدار دیگه بیشتر هست ،بگیم مثلا رنگ غالب این هندونه سبز هست!!!؟
شرمنده ! نگفتید بالاخره این سه نمودار نمایش شدت رنگ آبی و قرمز و سبز قسمت مربوط به" فقط هندونه "هست؟
و راجع به اون اکسل یا وردی که مد نظرتون هست میشه توضیح بدید؟!!

rahnema1
دوشنبه 30 تیر 1393, 22:09 عصر
الان شما سه تا x تولید کردید مثلا به نام x1,x2,x3 حالا یه تصویر مثلا 20در 20 ازا ین رنگ درست کنید و نشون بدید

img=uint8(ones(20,20,3));
img(:,:,1)=img(:,:,1)*x1;
img(:,:,2)=img(:,:,2)*x2;
img(:,:,3)=img(:,:,3)*x3;
imshow(img)

یک ماتریس هم که بخواهید ذخیره کنید که در اکسل باز بشه مثلا اسم ماتریس ما m باشه

dlmwrite('file.csv',m);

nadaf.m
سه شنبه 31 تیر 1393, 11:31 صبح
ببخشید برای اینکه بخوایم در نمودار هیستوگرام ، x مربوط به حداکثر مقدار c رو پیدا کنیم،باید دقیقا از چه کدی استفاده کنیم؟

rahnema1
سه شنبه 31 تیر 1393, 13:02 عصر
ببخشید برای اینکه بخوایم در نمودار هیستوگرام ، x مربوط به حداکثر مقدار c رو پیدا کنیم،باید دقیقا از چه کدی استفاده کنیم؟

x(c==max(c))(1)

nadaf.m
سه شنبه 31 تیر 1393, 16:49 عصر
اجراش کردم ولی خطای زیر رو میده!!
Error: ()-indexing must appear last in an index expression.

rahnema1
سه شنبه 31 تیر 1393, 18:15 عصر
اجراش کردم ولی خطای زیر رو میده!!
Error: ()-indexing must appear last in an index expression.

p=x(c==max(c));
p=p(1);

nadaf.m
سه شنبه 31 تیر 1393, 18:49 عصر
ممنون!جواب داد.

sheidabahrami
دوشنبه 18 بهمن 1395, 10:08 صبح
سلام.وقتتون بخیر.
میشه در مورد این برنامه توضیح بدید؟من ی پروژه تشخیص تومور دارم ک این برنامه قسمتی از اون هستش.متاسفانه من با متلب آشنایی ندارم.زود جواب بدید ممنون میشم.

sheidabahrami
دوشنبه 18 بهمن 1395, 10:11 صبح
منظورم این برنامه س.

close all
clc
clear all
fontSize = 13;
p=imread('8.jpg');
v = rgb2gray(p);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
hy = fspecial('sobel');
hx = hy';
Iy = imfilter(double(v), hy, 'replicate');
Ix = imfilter(double(v), hx, 'replicate');
gradmag = sqrt(Ix.^2 + Iy.^2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
L = watershed(gradmag);
Lrgb = label2rgb(L);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
se = strel('disk', 50);
Io = imopen(v, se);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Ie = imerode(v, se);
Iobr = imreconstruct(Ie, v);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Ioc = imclose(Io, se);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Iobrd = imdilate(Iobr, se);
Iobrcbr = imreconstruct(imcomplement(Iobrd),imcomplement(Iob r));
Iobrcbr = imcomplement(Iobrcbr);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fgm = imregionalmax(Iobrcbr);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
I2 = v;
I2(fgm) = 255;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
se2 = strel(ones(5,5));
fgm2 = imclose(fgm, se2);
fgm3 = imerode(fgm2, se2);
fgm4 = bwareaopen(fgm3, 20);
I3 = v;
I3(fgm4) = 255;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bw = im2bw(Iobrcbr, graythresh(Iobrcbr));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bw=~bw;
figure, subplot(1,1,1);
imshow(bw), title('tasvire baynere shodeh')