三国纷争
使用方法:clc;A=importdata('D:/seedpoint.txt');str = A.textdata{1};str1 = strrep(str,'/','\');I = im2double(imread( str1));x = A.data(1,1);y = A.data(2,1);reg_maxdist = A.data(3,1);%function J=regiongrowing(I,x,y,reg_maxdist)% 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_maxdist','var')==0), reg_maxdist=0.2; end%if(exist('y','var')==0), figure, imshow(I,[]); [y,x]=getpts; y=round(y(1)); x=round(x(1)); endJ = zeros(size(I)); % OutputIsizes = size(I); % Dimensions of input imagereg_mean = I(x,y); % The mean of the segmented regionreg_size = 1; % Number of pixels in region% Free memory to store neighbours of the (segmented) regionneg_free = 10000; neg_pos=0;neg_list = zeros(neg_free,3);pixdist=0; % Distance of the region newest pixel to the regio mean% Neighbor locations (footprint)neigb=[-1 0; 1 0; 0 -1;0 1];% Start regiogrowing until distance between regio and posible new pixels become% higher than a certain tresholdwhile(pixdist% Add new neighbors pixelsfor j=1:4,% Calculate the neighbour coordinatexn = x +neigb(j,1); yn = y +neigb(j,2);% Check if neighbour is inside or outside the imageins=(xn>=1)&&(yn>=1)&&(xn<=Isizes(1))&&(yn<=Isizes(2));% Add neighbor if inside and not already part of the segmented areaif(ins&&(J(xn,yn)==0))neg_pos = neg_pos+1;neg_list(neg_pos,:) = [xn yn I(xn,yn)]; J(xn,yn)=1;endend% Add a new block of free memoryif(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 regiondist = 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 regionreg_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) listneg_list(index,:)=neg_list(neg_pos,:); neg_pos=neg_pos-1;endimwrite(J,'j.png');J2gray=rgb2gray(imread('j.png'));%imwrite(L,'J2gray.png')Isize=size(J2gray);for i=1:Isize(1)for j=1:Isize(2)if(J2gray(i,j)==76) J2gray(i,j)=0;else J2gray(i,j)=3;end;end;end;imwrite(J2gray,'J2gray_0_3.png');% Return the segmented area as logical matrixJ=J>1;