# How can I perform region growing with two seed points?

5 views (last 30 days)

Show older comments

Cretu Ioana
on 15 Mar 2020

Answered: Image Analyst
on 15 Mar 2020

Hi everyone!

I have some images of the carotid artery, and I need to segment the image to obtain the outer wall and the plaque region. I used a function posted here (region growing from one seed point), and I tried to modify it. I want the function to have two seeded points, but my function doesn't work. Can you please give me some suggestion?

This is for my school project.

function J=RG2incerc(I,x,y,x2,y2,reg_maxdist1,reg_maxdist2)

% This function performs "region growing" in an image from a specified

% seedpoint (x,y)

%

% J = regiongrowing(I,x,y,t)

%

% I : input image

% J : logical output image of region

% x,y : the position of the seedpoint (if not given uses function getpts)

% t : maximum intensity distance (defaults to 0.2)

%

% The region is iteratively grown by comparing all unallocated neighbouring pixels to the region.

% The difference between a pixel's intensity value and the region's mean,

% is used as a measure of similarity. The pixel with the smallest difference

% measured this way is allocated to the respective region.

% This process stops when the intensity difference between region mean and

% new pixel become larger than a certain treshold (t)

%

% Example:

% I = im2double(imread('medtest.png'));

% x=198; y=359;

% J = regiongrowing(I,x,y,0.2);

% figure, imshow(I+J);

%

% Author: D. Kroon, University of Twente

if(exist('reg_maxdist1','var')==0), reg_maxdist1=0.2; end

if(exist('y','var')==0), figure, imshow(I,[]); [y1,x1]=getpts; y=round(y(1)); x=round(x(1)); end

J = zeros(size(I)); % Output

J2=zeros(size(I));

Isizes = size(I); % Dimensions of input image

reg_mean = I(x,y); % The mean of the segmented region

reg_mean2=I(x2,y2);

reg_size = 1; % Number of pixels in region

reg_size2=1;

% Free memory to store neighbours of the (segmented) region

neg_free = 10000; neg_pos=0; neg_free2=10000; neg_pos2=0;

neg_list = zeros(neg_free,3); neg_list2 = zeros(neg_free2,3);

pixdist=0; % Distance of the region newest pixel to the regio mean

pixdist2=0;

% Neighbor locations (footprint)

neigb=[-1 0; 1 0; 0 -1;0 1];

neigb2=[-1 0; 1 0; 0 -1;0 1];

% Start regiogrowing until distance between regio and posible new pixels become

% higher than a certain treshold

while(pixdist<reg_maxdist1&®_size<numel(I))

% Add new neighbors pixels

for j=1:4,

% Calculate the neighbour coordinate

xn = x +neigb(j,1); yn = y +neigb(j,2);

% Check if neighbour is inside or outside the image

ins=(xn>=1)&&(yn>=1)&&(xn<=Isizes(1))&&(yn<=Isizes(2));

% Add neighbor if inside and not already part of the segmented area

if(ins&&(J(xn,yn)==0))

neg_pos = neg_pos+1;

neg_list(neg_pos,:) = [xn yn I(xn,yn)]; J(xn,yn)=1;

end

end

% Add a new block of free memory

if(neg_pos+10>neg_free), neg_free=neg_free+10000; neg_list((neg_pos+1):neg_free,:)=0; end

% Add pixel with intensity nearest to the mean of the region, to the region

dist = abs(neg_list(1:neg_pos,3)-reg_mean);

[pixdist, index] = min(dist);

J(x,y)=2; reg_size=reg_size+1;

% Calculate the new mean of the region

reg_mean= (reg_mean*reg_size + neg_list(index,3))/(reg_size+1);

% Save the x and y coordinates of the pixel (for the neighbour add proccess)

x = neg_list(index,1); y = neg_list(index,2);

% Remove the pixel from the neighbour (check) list

neg_list(index,:)=neg_list(neg_pos,:); neg_pos=neg_pos-1;

end

J=J>1;

while(pixdist2<reg_maxdist2&®_size2<numel(I))

% Add new neighbors pixels

for j=1:4,

% Calculate the neighbour coordinate

xn = x2 +neigb(j,1); yn = y2 +neigb(j,2);

% Check if neighbour is inside or outside the image

ins=(xn>=1)&&(yn>=1)&&(xn<=Isizes(1))&&(yn<=Isizes(2));

% Add neighbor if inside and not already part of the segmented area

if(ins&&(J(xn,yn)==0))

neg_pos2 = neg_pos2+1;

neg_list2(neg_pos2,:) = [xn yn I(xn,yn)]; J2(xn,yn)=1;

end

end

% Add a new block of free memory

if(neg_pos2+10>neg_free2), neg_free2=neg_free2+10000; neg_list2((neg_pos2+1):neg_free2,:)=0; end

dist2 = abs(neg_list2(1:neg_pos2,3)-reg_mean2);

[pixdist2, index] = min(dist2);

J2(x,y)=2; reg_size2=reg_size+1;

% Calculate the new mean of the region

reg_mean2= (reg_mean2*reg_size2 + neg_list2(index,3))/(reg_size2+1);

x2 = neg_list2(index,1); y2 = neg_list2(index,2);

% Remove the pixel from the neighbour (check) list

neg_list2(index,:)=neg_list2(neg_pos2,:); neg_pos2=neg_pos2-1;

end

J2=J2>1;

##### 0 Comments

### Accepted Answer

Stijn Haenen
on 15 Mar 2020

### More Answers (1)

Image Analyst
on 15 Mar 2020

I see you've accepted Stijn's answer so your problem is already solved now,

but for what it's worth, I'm attaching my magic wand program. It's similar to the magic wand region growing tool in Photoshop. Maybe it will help other people.

##### 0 Comments

### See Also

### Categories

### Products

### Community Treasure Hunt

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

Start Hunting!