www.gusucode.com > IPCV_Eval_Kit_R2019a_0ce6858工具箱matlab程序源码 > IPCV_Eval_Kit_R2019a_0ce6858/code/demo_files/I2_09_4_6_Segmentation_Watershed.m

    %% 偔偭偮偄偰偄傞庬傪屄暿偵擣幆偟丄屄悢丒柺愊偺寁應丄柺愊暘晍丒暯嬒柺愊偺寁嶼
%    弶婜壔
clear;clc;close all;imtool close all

%% 僀儊乕僕偺撉傒崬傒
I = imread('I2_09_4_6_DSC_1903cr.jpg');
figure;imshow(I);                          % ;偑僐儅儞僪嬫愗

%% Final夋憸傪妋擣
figure;imshow(imread('I2_09_4_6_DSC_1903result.jpg'));

%% 僌儗乕僗働乕儖傊曄姺
G = rgb2gray(I);
imtool(G);

%% 婸搙偵傛傝擇抣壔
figure;imhist(G);
%%
BW = G < 195;
imshow(BW);shg

%% 嵶偐偄僲僀僘偺彍嫀
BWclean = bwareaopen(BW, 20);
figure;imshow(BWclean);

%% 寠偺揾傝偮傇偟
BWfill = imfill(BWclean, 'holes');
figure;imshow(BWfill);

%% 夋柺抂偺偐偗偰偄傞傕偺傪彍嫀
BWclear = imclearborder(BWfill);
figure; imshow(BWclear);

%% 嫍棧曄姺偺幚峴乮2抣夋憸僄僢僕偵岡攝傪偮偗傞乯
BWclear_b = ~BWclear;
imshow(BWclear_b);shg;         %攚宨偲慜宨偺斀揮寢壥
%%
BWdist = bwdist(BWclear_b);
figure;imshow(BWdist,[]);shg;  %嫍棧曄姺(敀偄椞堟傑偱偺嫍棧)偺寢壥
%%
BWdist = -BWdist;
imshow(BWdist, []);shg;        %攚宨偲慜宨偺斀揮寢壥
%   棻巕椞堟撪偱丄墢(慜宨)傑偱偺嫍棧偑偦偺夋慺埵抲偺抣
%   攚宨椞堟偼丄抣='0'

%% 僶僢僋僌儔儞僪偑椞堟偵娷傑傟側偄傛偆偵丄-Inf偵巜掕
BWdist(BWclear_b) = -Inf;         %BWdist偱敀偔側偭偰偄傞攚宨晹暘傪-Inf偵偡傞丅
imshow(BWdist, []);shg;

%% 堦偮偺棻巕偑暋悢偵暘妱偝傟傞偺傪杊偖偨傔偵丄奺棻巕撪嬌彫椞堟傪侾偮傊
figure;imshow(imregionalmin(BWdist));  %嬊彫晹暘傪敀偔昞帵
%%
BWhmin = imhmin(BWdist, 2);            %嬊彫晹暘傪2帩偪忋偘傞
figure;imshow(imregionalmin(BWhmin));  %嬊彫晹暘傪嵞搙敀偔昞帵

%% 僂僅乕僞乕僔僃僢僪曄姺傪峴偄丄嬌彫揰枅偵椞堟暘妱丒昞帵
%figure;surf(double(BWhmin));shading interp; %昞柺僾儘僢僩
%
BWshed = watershed(BWhmin);

% 昞帵
imtool(BWshed,[]);   %椞堟枅偵斣崋偑妱傝怳傜傟偰偄傞偺傪妋擣   
                     %攚宨偼椞堟1
                     %椞堟0 偼暘悈椾(曯)丗摿掕偺暘悈椾椞堟偵懏偝側偄丅
BWlabel = label2rgb(BWshed,'jet');
imshow(BWlabel);shg                %椞堟偛偲偵暿偺怓偱昞帵 (椞堟0偼丄敀怓)

%% regionprops娭悢偵傛傝丄奺僄儕傾摍傪寁嶼
stat = regionprops(BWshed, 'Area', 'Centroid')
stat(10)
stat(1) = [];      % 攚宨偐傜偺僨乕僞傪彍嫀

%% 寢壥偺昞帵
BWshed(BWshed==1)=0;    % 攚宨(椞堟斣崋1)傪椞堟斣崋0傊曄峏
boundaries = bwboundaries(BWshed, 'noholes'); % 奺椞堟偺嫬奅傪拪弌乮寠偼僩儗乕僗偣偢乯
figure;imshow(I);
hold on;
for k=1:size(boundaries)
   b = boundaries{k};
   plot(b(:,2),b(:,1),'r','LineWidth',2);
end
hold off

%% 廔椆















%% 嶲峫 (捛壛偺張棟) %%%%%%%%%%%%%%%
%% 棻巕偺屄悢
size(stat, 1)
%% 棻巕偺屄乆偺柺愊偺暯嬒
mean([stat.Area])
%% 棻巕偺屄乆偺柺愊
A=[stat.Area]
%% 僸僗僩僌儔儉昞帵
figure;hist(A, [1700:100:2500]);
%% 憤柺愊
sum([stat.Area])

%% 椫妔拪弌偺暿偺僗僋儕僾僩(BWlabel偺敀偄晹暘(椞堟斣崋0)傪拪弌)
BWperi_t = (BWlabel(:,:,1) == 255) & ...
           (BWlabel(:,:,2) == 255) & ...
           (BWlabel(:,:,3) == 255);
imshow(BWperi_t);shg;
% 尒傗偡偔偡傞偨傔偵椫妔傪朿挘張棟偱懢偔
BWperi = bwmorph(BWperi_t, 'dilate');
figure;imshow(BWperi);
% 椫妔傪愒慄偱忋彂偒
BWfalse = false(size(BWperi));
Iperi = I;                       % 擖椡夋憸傪僐僺乕
Iperi(cat(3,BWfalse, BWperi, BWfalse)) = 255;
Iperi(cat(3,BWperi,  BWfalse,BWperi )) = 0;
Iperi(cat(3,BWperi, BWfalse, BWfalse)) = 255;
Iperi(cat(3,BWfalse,  BWperi,BWperi )) = 0;
imshow(Iperi);shg;
% 屄乆偺棻巕偺丄拞怱揰偲柺愊傪忋彂偒昞帵
centroids = cat(1,stat.Centroid);  %拞怱揰偺嵗昗儀僋僩儖傪嶌惉
areas     = cat(1, stat.Area);     %柺愊儀僋僩儖偺嶌惉
Ifinal = insertMarker(Iperi, centroids, 'star', 'Color','green', 'Size',5);  %拞怱埵抲偵椢偺仏儅乕僋傪婰偡
Ifinal = insertText(Ifinal, centroids,  cellstr(num2str(areas)), 'BoxOpacity',0, 'FontSize',18); %柺愊偺抣傪彂崬傒
imshow(Ifinal);shg;

%% Copyright 2013 The MathWorks, Inc.
%    Masa Otobe (masa.otobe@mathworks.co.jp)

% 昁梫側僼傽僀儖 : DSC_1903cr.jpg, DSC_1903result.jpg