# مباحث متفرقه برنامه نویسی > برنامه نویسی Matlab >  نوشتن برنامه ای برای استخراج خصوصیات فیزیکی از یک تصویر با پردازش تصویر در متلب

## nadaf.m

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

----------


## rahnema1

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

----------


## nadaf.m

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



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

----------


## rahnema1

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

----------


## nadaf.m

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

----------


## rahnema1

خب کد خودتون را بذارید اینجا تا بر اساس اون بقیه چیزها را به دست بیاریم

----------


## nadaf.m

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%

----------


## nadaf.m

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%

----------


## nadaf.m

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%

----------


## rahnema1

شما که ماشالله خوب کد می زنی این که دیگه کاری نداره ( اگه هندونه ها همشون افقی باشن)

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

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

----------


## rahnema1

از این سایت گرفتم
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

تو سایتی که گفتید رفتم ،اما متاسفانه اونجا هم به نتیجه ای نرسیدم.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

----------


## nadaf.m

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

----------


## rahnema1

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

----------


## nadaf.m

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

----------


## rahnema1

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

----------


## rahnema1

این دو تصویری که فرستادین به این صورت میشه با اون برنامه که نوشتم. بیضی کامل نیستند
http://www.sharefile.ir/uploads/1404720806.zip

----------


## nadaf.m

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

----------


## rahnema1

از روش سوبل استفاده کنید
مثلا مساحت این جور به دست میاد

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

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

----------


## rahnema1

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

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

----------


## rahnema1

به همراه فیلتر سوبل این را بذارید. اگه فایده نداشت همین طور که از بالا به پایین داخل هندونه را سفید کردیم باید از چپ به راست هم همین کار را انجام بدیم

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

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

----------


## rahnema1

> فقط برای یادگیری بیشتر می خواستم ازتون بپرسم چه جوری میشه از چپ به راست هم سطح هندونه رو سفید کرد؟؟؟؟!!!و کلا ترکیب دستوراتش با حالت  از بالا به پایین به چه شکل میشه؟؟؟!!


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




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



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

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

----------


## nadaf.m

راستش در مورد ترکیب این دستورات( از بالا به پایین و چپ به راست) که گفتید ،فکر میکنم کدی که براتون فرستادم ،قسمت بیشترش تکمیل هست و فقط احتیاج به یه اصلاح کوچولو داره!!!!ولی اگه میشه یه مقدار بهم فرصت بدید تا اون کد الگوی چپ به راست رو پیدا کنم!!همون طور که گفتید من هم احساس میکنم باید کد ساده ای باشه!!!ولی لطف کنید اگه از نظرتون این کد خیلی اشتباه هست،بهم بگید!!!! (ولی من تستش کردم بد جواب نمیداد!!!)   
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;endfor i=idxmnmx2    segment2(mn2(i):mx2(i),i)=1;endimg_3=imadd(segment1,segment2);figure, imshow(img_3);masahat=sum(img_3(:))

----------


## nadaf.m

ببخشید من نتونستم از این تگ که گفتید درست استفاده کنم.
اما باید بگم که ،کد خودتون رو با یه ذره تغییر کوچیک تونستم واسه اکثر تصاویر کاربردیش کنم ،منظورم این هست که سطح اکثر هندونه ها سفید میشه،که تنها تغییرش توی خط 4ام بود و به صورت زیر شد:
[CPP]
labe1=bwmorph(labe1,'dilate',13);[/CPP]

----------


## nadaf.m

و در آخر ضمن تشکر از کمک های خوب شما........
کدی که گفتم برای همه ی تصاویرخیلی خوب جواب داد به صورت زیر هست:

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

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

----------


## rahnema1

> راستش در مورد ترکیب این دستورات( از بالا به پایین و چپ به راست) که گفتید ،فکر میکنم کدی که براتون فرستادم ،قسمت بیشترش تکمیل هست و فقط احتیاج به یه اصلاح کوچولو داره!!!!ولی اگه میشه یه مقدار بهم فرصت بدید تا اون کد الگوی چپ به راست رو پیدا کنم!!همون طور که گفتید من هم احساس میکنم باید کد ساده ای باشه!!!ولی لطف کنید اگه از نظرتون این کد خیلی اشتباه هست،بهم بگید!!!! (ولی من تستش کردم بد جواب نمیداد!!!)


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

----------


## rahnema1

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


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

----------


## rahnema1

> ببخشید من نتونستم از این تگ که گفتید درست استفاده کنم.
> اما باید بگم که ،کد خودتون رو با یه ذره تغییر کوچیک تونستم واسه اکثر تصاویر کاربردیش کنم ،منظورم این هست که سطح اکثر هندونه ها سفید میشه،که تنها تغییرش توی خط 4ام بود و به صورت زیر شد:
> [CPP]
> labe1=bwmorph(labe1,'dilate',13);[/CPP]


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

----------


## nadaf.m

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

----------


## nadaf.m

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


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

----------


## rahnema1

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


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

----------


## nadaf.m

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

----------


## rahnema1

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

بابت همه ی کمک ها و راهنمایی های مفیدتون، تشکر میکنم .امیدوارم همیشه موفق و پیروز باشید.

----------


## nadaf.m

> 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'
> ...




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

----------


## rahnema1

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


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

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

----------


## nadaf.m

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

----------


## rahnema1

حالا حتما لازمه جدول کشیده بشه؟ نمیشه مثلا نتایج را برای داخل ورد و مرتب کنی؟
در مورد سوال دوم اگخ منظورتون اینه که رنگ غالب به دست بیاد می تونید هیستوگرام تصویر را به دست بیارید و مقداری که بیشترین تکرار را داره رنگ غالب تصویر محسوب میشه

----------


## nadaf.m

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

ضمیمه 121358

----------


## rahnema1

ضمیمه لینکش خرابه کار نمی کنه

----------


## nadaf.m

hist.jpg تونستید ببینیدش؟اگه نشد،پس چه جوری نشونتون بدم!!!؟؟باید چی کار کرد؟

----------


## rahnema1

نمودارش منظورم نیست ببینید اول شما باید بتونید هندونه را استخراج کنید و فقط هیستوگرام اون جایی را به دست بیارید که شامل هندونه میشه
نمودار از روی یک سری اعداد تهیه میشه حالا توی این نمودار مقدار آخر بیشترین تکرار را داره

----------


## nadaf.m

ببینید من از همون اول مشکل داشتم که چه جوری میشه هندونه رو از تصویر کلا جدا کرد!!؟و مگه برای رسم  هیستوگرام نباید اول تصویر رو به فرمت خاکستری تبدیل کرد و بعد با استفاده از اون نمایشش داد!!پس اگه به این صورت باشه نمیشه با هیستوگرام با استفاده از شدت مقدار، رنگ رو مشخص کرد!!یا حتی اگه هیستوگرامش رسم شه دیگه اون شدت رنگ واقعی تصویر رو نشون نمیده!!!

----------


## rahnema1

ما با استفاده از انواع ترفندها تونستیم یک تصویر سیاه و سفید از هندونه ( منظورم که سطح هندونه سفید و بقیه سیاه) درست کنیم
حالا ما تصویر اصلی را می گیریم و می گیم هر چا که تصویر هندونه سیاه وسفید برابر 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

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

----------


## rahnema1

[c,x]=imhist...
اینجا ببینید در کدوم x مقدار c برابر با حداکثر میشه

----------


## nadaf.m

نمیدونم منظورتون دقیقا چی بود اما به صورت  زیر که اجراش کردم در x=14   مقدار c  حداکثر شد!!

[c,x]=imhist(Ih)


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

----------


## rahnema1

> نمیدونم منظورتون دقیقا چی بود اما به صورت  زیر که اجراش کردم در x=14   مقدار c  حداکثر شد!!
> 
> [c,x]=imhist(Ih)
> 
> 
> خب حالا یعنی چی شد!!میشه بیشتر توضیح بدید!


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

----------


## nadaf.m

منظورتون اینه که اگه برای هر مولفه این کد رو بزنیم برای هر یک  x یه مقدار c بدست میاد و باید برای هرمولفه ، x ای رو در نظر گرفت که در آن مقدار c حداکثر شده باشه!!اینطوری اون سه تا x ای که میگید بدست میاد؟

----------


## rahnema1

> منظورتون اینه که اگه برای هر مولفه این کد رو بزنیم برای هر یک  x یه مقدار c بدست میاد و باید برای هرمولفه ، x ای رو در نظر گرفت که در آن مقدار c حداکثر شده باشه!!اینطوری اون سه تا x ای که میگید بدست میاد؟


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

----------


## nadaf.m

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

----------


## rahnema1

الان شما سه تا 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

ببخشید برای اینکه بخوایم در نمودار هیستوگرام ، x  مربوط به حداکثر مقدار  c  رو پیدا کنیم،باید دقیقا از چه کدی استفاده کنیم؟

----------


## rahnema1

> ببخشید برای اینکه بخوایم در نمودار هیستوگرام ، x  مربوط به حداکثر مقدار  c  رو پیدا کنیم،باید دقیقا از چه کدی استفاده کنیم؟


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

----------


## nadaf.m

اجراش کردم ولی خطای زیر رو میده!!Error: ()-indexing must appear last in an index expression.

----------


## rahnema1

> اجراش کردم ولی خطای زیر رو میده!!Error: ()-indexing must appear last in an index expression.


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

----------


## nadaf.m

ممنون!جواب داد.

----------


## sheidabahrami

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

----------


## sheidabahrami

منظورم این برنامه س.

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')

----------

