version 1.4.0.0 (19.6 KB) by
Micael Couceiro

Multiple Image Segmentation using PSO, DPSO, FO-DPSO and exhaustive methods.

MatLab function for Multiple Image Segmentation using PSO (Particle Swarm Optimization), DPSO (Darwinian PSO), FO-DPSO (Fractional-Order DPSO) and exhaustive methods based on the image histogram shape. The exhaustive method is still in development. The exhaustive method is still in development.

Iout = segmentation(I)

Iout - segmented image.

I - any type of image with multiple intensity levels(e.g., grayscale, color).

[Iout,intensity] = segmentation(I)

intensity - returns the intensity that maximizes the between-class variance. size(intensity)=[size(I,3) level].

[Iout,intensity,fitness] = segmentation(I)

fitness - returns the fitness of the between-class variance. size(fitness)=[size(I,3) 1]

[Iout,intensity,fitness,time] = segmentation(I)

time - returns the CPU computation time

size(time)=[1 1]

[Iout,intensity] = segmentation(I,level)

level - segmentation level. Must be integer ... (Default 2). If level>2

then the segmented image Iout will be an RGB image.

[Iout,intensity] = segmentation(I,level,method)

method - choose the method to perform the multi-segmentation of the image. The pso, dpso, fodpso and exhaustive are the only ones implemented yet. Default pso).

...

Example: Iout = segmentation(I,4,'pso')

For a detailed description on multiple image segmentation using PSO algorithms please refer to:

Pedram Ghamisi, Micael S. Couceiro, Jón Atli Benediktsson & Nuno M.F. Ferreira. “An Efficient Method for Segmentation of Images Based on Fractional Calculus and Natural Selection”, Expert Systems with Applications, Elsevier, 2012.

Micael S. Couceiro & J. Miguel A. Luz

v4.0

01/11/2011

Created 15/11/2010

Last Update 16/01/2012

Micael Couceiro (2020). Segmentation (https://www.mathworks.com/matlabcentral/fileexchange/29517-segmentation), MATLAB Central File Exchange. Retrieved .

Created with
R2009b

Compatible with any release

**Inspired:**
TRIM: Triangulating Image

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!Create scripts with code, output, and formatted text in a single executable document.

mohamed ahmedPeace be upon you, please explain this part to me and the program will give me a mistake in it. What should I do?

if size(I,3)==1 %grayscale image

[n_countR,x_valueR] = imhist(I(:,:,1));

elseif size(I,3)==3 %RGB image

[n_countR,x_valueR] = imhist(I(:,:,1));

[n_countG,x_valueG] = imhist(I(:,:,2));

[n_countB,x_valueB] = imhist(I(:,:,3));

end

Nt=size(I,1)*size(I,2);

Lmax=256; %256 different maximum levels are considered in an image (i.e., 0 to 255)

for i=1:Lmax

if size(I,3)==1 %grayscale image

probR(i)=n_countR(i)/Nt;

elseif size(I,3)==3 %RGB image

probR(i)=n_countR(i)/Nt;

probG(i)=n_countG(i)/Nt;

probB(i)=n_countB(i)/Nt;

end

moom h%%segmentation(I,level,method)

I=imread('C:\Users\xxx\Desktop\3.jpg');

Iout = segmentation(I,4,'pso')

%Iout = segmentation(I,4,'dpso')

%Iout = segmentation(I,4,'fodpso')

%Iout = segmentation(I,4,'exhaustive')% in line 3243

figure;imshow(Iout)

ABCDThankyou very much

farrah aslamDee TCan someone explain this part:

vR = ( (vR <= vmin).*vmin ) + ( (vR > vmin).*vR );

vR = ( (vR >= vmax).*vmax ) + ( (vR < vmax).*vR );

and

xR = ( (xR <= X_MINR(1)).*X_MINR(1) ) + ( (xR > X_MINR(1)).*xR );

xR = ( (xR >= X_MAXR(1)).*X_MAXR(1) ) + ( (xR < X_MAXR(1)).*xR );

Muhammad Aligreat work.

Haram KimFor users, I noticed that image range maybe 0~255. If you gave it noramlized image, result showes 0s.

Fahad MahdiCan you share the test image with me? please email me in fahadapecedu@gmail.com

Fahad Mahdikirti kaushali need a documentary that explains the code. actually i am beginner for matlab

wissal guedriwissal guedriCan someone give me a documantary or a description that explains the code please?

wissalguedri@gmail.com

Micael CouceiroThe colours of the output image are not relevant - it is a segmentation procedure, so what matters are the different classes of colours. In my case, I decided to choose the colours representing the larger between-class variance. Nevertheless, you can replace the colours for whatever you want, as long as you keep the same different classes.

begginer01@Micael Couceiro.. Sir, the image got from this code is different from segmentation done from FCM, Kmeans...In this segmentation, the grayscale image is divided in 3 color..light gray,dark gray and black...why there is no white color comes when I put grayscale image as input?? Plz solve my problem..Plz..if u want i can share my output image too..plz reply..

begginer01Can anybody help me to see results of that code?? I want to see the segmented image using PSO,DPSO, FODPSO and exhaustive method in subplot so that i can compare all the results..how can i modify this code and and see all results in one plot? Plz help me..m new to matlab...

begginer01@Micael Couceiro..thanks for the reply.. I sent u an email with my image..kindly see that mail..and then see..whether it is segmented or not..I am not able to understand where i can use imshow function to show my results. Kindly give me ur current email id so that i can again send u the email with my gray image. waiting for ur quick reply. :)

Micael Couceirobegginer01: You need to provide me more details so I can understand what the problem might be. Be sure that you are opening your image as a gray image and not RGB image to start with or, alternatively, after you open your gray image simply use the first depth element of the M x N x D image, i.e., I = I(:,:,1), and then use this new image in the segmentation function.

begginer01this is awesome..but i cann't able to see my segmented image results on my gray image.I sent u an email,could you plz check that reply me...thanks a lot..

Jorge Hernandez tapiaHelo, how can I extract every class present in the algorithm output, by the way awesome work

Franck n'guyenwonderful !

but have you a 3D version applied for :

load mri

D=squeeze(D);

Iout=segmentation(D); ?????

thank you again

rahul vermaIt worked after a restart ;-)

rahul vermaI tried these,

1) Didn't work

>> I=imread('C:\mtlb\1.jpg');

>> Iout = segmentation(I,4,'pso')

2) >> Iout = segmentation(1,4,'pso')

Undefined function or variable 'segmentation'.

Please help me how to run this code

thanks in advanced

email : rahulverma1790@gmail.com

Tirupal TalariRespected Sir,

im a Research Scholar solving a paper in image fusion using PSO and I need to divide the image (size 256x256) into 3x3, 5x5, 7x7 blocks automatically using PSO please help me. my mail id is:tirutalari@gmail.com

shivali kSir

can u please mail me code to calculate threshold of an image using pso only. I have understood the algo of pso but i am not able to write its code in matlab. Will be very thankful to you if u help me.

Andrew DiamondGave it a color image, returned a segmentation image of 0s.

Vasumathi GaneshHello sir,

I tried to run your segmentation.m file, But it shows following error.

Error using segmentation (line 50)

Not enough input arguments.

How to clear this?

Joy GoswamiAhmad TaherABIN joyRespected Sir,

I already try your coding and it give me a good result. I need your help,how to choose the level for the PSO as 2.

so can u please help me. Thank you

NITHYARespected Sir,

i'm doing my ME project in brain tumor image segmentation using PSO i dont know how to calculate the fitness function and how to divide 256x256 image into 3x3,4x4 labels please help me.my mail id is:nithyamanianbeece@gmail.com

vatsrespected sir,

iam not able to get your code. sir please can you mail me the matlab code for image thresholding using pso only. i'll be very thankful to you.

email id-pankaj.vats1010@gmail.com.

Akshay GoreMicael CouceiroHello Marikhs,

Please, note that deleting the DPSO and FODPSO is irrelevant. As long as you choose 'pso' as method it won't influence at all.

The example given in the header should work on any image:

Iout = segmentation(I,4,'pso')

If you're having a problem working with a specific image just send it to me to micaelcouceiro@gmail.com and I'll try to check what's going on.

Regards.

Marikhs RosesDear Sir,

I already try your coding and it give me a good result for the first try but after that it cannot give a result. I need your help. Can you please give me the coding for image segmentation using PSO only. the one that u have uploaded having some problem when i try to delete the DPSO and FODPSO. Please email me the code dayanghalimah@ymail.com and may God bless you for helping other people.

Micael CouceiroHello,

One of the references is cited on the description of the matlab file:

Pedram Ghamisi, Micael S. Couceiro, Jón Atli Benediktsson & Nuno M.F. Ferreira. “An Efficient Method for Segmentation of Images Based on Fractional Calculus and Natural Selection”, Expert Systems with Applications, Elsevier, 2012.

An alternative would be:

Pedram Ghamisi, Micael S. Couceiro, Fernando M. L. Martins and Jón Atli Benediktsson. “Multilevel Image Segmentation Based on Fractional-Order Darwinian Particle Swarm Optimization”, IEEE Transactions on Geoscience and Remote Sensing, 99, pp. 1-13, 2013.

If you have any problem accessing those e-mail me to micaelcouceiro@gmail.com and I'll send you my personal copy.

Regards.

geDear Micael Couceiro,

The functions looks wonderful,but can your give me some reference about this algorithm, if the principle will be presented ,I would be appreciated.Thanks.

My E_mail address is:gexinmin2002@163.com

Micael CouceiroDear Marikhs Roses,

Can you please tell me more details about what you may need? Did you tried to use this function on your case study first?

Regards

Marikhs Rosesi have final year project title 'PSO-based approach in image segmenttation.' I dont really know about my own project because we will learn image processing in another months. so can u please help me. Thank you :)

amal hamedManiniSir,

Could you please suggest a code for color image segmentation using PSO for matlab beginners like me. I am unable to follow the code particularly the fitness function. Could you please suggest a simple code or a fitness function that i could modify to get the color image segmented output.

Thanks

Micael CouceiroDear Gousal,

The help (header of the script) is pretty much straightforward. But, basically, you simply have to open an image using MatLab as, for instance:

I=imread('teste.bmp');

Then call the segmentation function as, for instance:

Iout = segmentation(I,4,'pso')

This will result in a image Iout with the same dimensions than I but with only 4 different levels.

Kind regards

shaik gousalTell me the execution process of this code .please,,,,

Micael CouceiroDear Chen,

You may use nanmax(fitR) instead. This gnores the NaN's and return the maximum value excluding NaN's. That's what I did in the code and thought it was fixed everywhere but seems not.

chenDear Micael,

I use this algorithm to catch on to PSO algorithm, and improve the algorithm by doing some experiments. My experiment just use the PSO. I have understood the reason how the NAN happened. But now another question is how to find max(fitR) because the fitR is NAN. Does the procedure stop when it has find max(fitR) is NAN or how to compare NAN?

Micael CouceiroDear Chen,

This is a really boring error that bothers me sometimes. By the way, does that happen for the PSO, DPSO and FODPSO or only one of those? I'm asking that cause I remember to implement a way to avoid outputing a fitness function of NaN if that ever occurs but seems that it's not totally fixed...

Now I'll tell you why it happens. As you may know, the algorithms perform the image segmentation maximizing the between-class variance. On the other hand, the computation of the between-class variance depends on the inverse (as denominator) of the probability of occuring a specific level on that image. So, let us suppose that you have a grayscale 8-bit image with all the components except the intensity level 100. This will mean that the probability of occuring 100 will be zero. Hence, if a particle traveling on the search space decides to compute the between-class variance based on the 100 level, its fitness will return NaN since the probability of 100 is zero.

As I didn't implemented a system to avoid non-existant colors, I implemented a way to ignore NaN values and saw it working...and that's why I need to know in which occasions does that happen.

chenDear Sir,

Thank you for supplying this code. While the algorithm run, the result of the fitness sometimes is NAN. So I wanna know the reason. Hope for your reply.

Micael CouceiroDear Manini,

The code you're presenting is exactly the fitness function, i.e., the between-class variance.

N is the number of particles and level the number of levels within each component (256 for 8-bit images).

You should read my paper

http://ac.els-cdn.com/S0957417412006756/1-s2.0-S0957417412006756-main.pdf?_tid=43de80bc-1c5f-11e2-a6bf-00000aab0f26&acdnat=1350920806_8d3bff7624f9aa0dd9cda3d10b6c3a4f

for more details about the fitness function.

In some few words, to compute the between-class variance, and since the number of levels may be different (it depends on the image you're using) a for loop is used. Therefore, the probability distribution and some other relevant parameters are then calculated at each iteration for each colour component and for each particle. In sum, the fitR(j) will represent the fitness function of the red colour component for robot j.

Hope that helps!

ManiniSir, I am using your code for RGB multiobject image. Sir i want to know which is the fitness function here. and

for j=1:N

if size(I,3)==1 %grayscale image

fitR(j)=sum(probR(1:xR(j,1)))*(sum((1:xR(j,1)).*probR(1:xR(j,1))/sum(probR(1:xR(j,1)))) - sum((1:Lmax).*probR(1:Lmax)) )^2;

for jlevel=2:level-1

fitR(j)=fitR(j)+sum(probR(xR(j,jlevel-1)+1:xR(j,jlevel)))*(sum((xR(j,jlevel-1)+1:xR(j,jlevel)).*probR(xR(j,jlevel-1)+1:xR(j,jlevel))/sum(probR(xR(j,jlevel-1)+1:xR(j,jlevel))))- sum((1:Lmax).*probR(1:Lmax)))^2;

end

fitR(j)=fitR(j)+sum(probR(xR(j,level-1)+1:Lmax))*(sum((xR(j,level-1)+1:Lmax).*probR(xR(j,level-1)+1:Lmax)/sum(probR(xR(j,level-1)+1:Lmax)))- sum((1:Lmax).*probR(1:Lmax)))^2;

fitBestR(j)=fitR(j);

sir this is one of the the for loop from your code. can you please explain this for loop. I will be thankful.

Thanks

Micael CouceiroEither you read the article recently publised on:

http://www.sciencedirect.com/science/article/pii/S0957417412006756?v=s5

Or you simply compare the fitness value (one of the outputs of the function).

Don't forget that all those algorithm are stochastic and for a correct evaluation you should perform multiple trials.

Mohsen DavarynejadHow to do evaluate the performance of each algorithm? So my question is that how should I believe that for instance the dpso outperforms the pso?

HarishDear sir,

Thank you very much for providing the code.

Please provide me mathematical description of the fitness function and if u have any published paper on it then a copy of that.

Micael Couceiro1º open an image in MatLab

I = imread('pic.jpg');

2º Follow instructions in the beginning of the code

e.g.,

Iout = segmentation(I);

3º See the result

e.g.,

imshow(Iout);

jjjhow to run it sir

SiroMicael CouceiroYou're welcome

Majid Al-Sirafiwonderful program,thank you dear

Micael CouceiroKyle, I just uploaded a new version with a new segmentation method btw (FO-DPSO).

The segmentation methods are based on the traditional PSO presented by Kennedy and Eberhart in 1995, the Darwinian PSO presented by Tillett et al in 2005 (see more about it in http://www.netsup.net/~jtillett/darwin/) and the Darwinian PSO extension using fractional calculus presented by me and other authors in the Fractional Signals and Systems Symposium in 2011. This last paper will be soon available.

Anyway, this script basically uses such optimization methods to find the maximum between-classes variances. Another more detailed paper describing this script will soon be published.

Kyle WangCould you indicate the paper that the code is implemented based on?

Micael CouceiroThe intensity will have the same value than the intensity level that presents the higher between-class variance.

In other words, if it is presenting a level of 50 it means that this is the optimal level.

Anyway, you can easily change this with the matlab find function as:

eg: [a,b]=find(IMAGE==50);

IMAGE(a,b)=255;

QingHello Micael,

I'm using your function to segment my grayscale images. However the max intensity of the output image is only 50. How do you set it to be 255? Thanks!

Muhammad NawazStrongly recommended for multicolour and multi objects images.