% @Author: Linbo<linbo.me>
% @Version: 1.0 25/10/2014
% This is the implementation of the
% Zhang-Suen Thinning Algorithm for skeletonization.
clc,clear
% load image data
% addpath('./data')
% Img_Original = imread('starimage2.jpg');
load image4.mat
%%%%%%%%%%加入噪声%%%%%%%%%%%%%%
image_1=imnoise(image,'gaussian',0,0.05);
image_2=imnoise(image_1,'salt & pepper',0.0001);
% imshow(image_2)
%%%%%%%%%%加入噪声%%%%%%%%%%%%%%
%%%%%%%%%%去除噪声%%%%%%%%%%%%%%
image_med=medfilt2(image_2);
% imshow(image_med)
%%%%%%%%%%去除噪声%%%%%%%%%%%%%%
% Convert gray images to binary images using Otsu's method
% Otsu_Threshold = graythresh(Img_Original);
% BW_Original = not(im2bw(Img_Original,Otsu_Threshold)); % must set object region as 1, background region as 0
%%%%%%%二值化%%%%%%%%%%%%%
%%%%%%%迭代法%%%%%%%%%%%%%
image_iteration=image_med;
%初始化阈值
B=image_med;
T=0.5*(double(min(B(:)))+double(max(B(:))));
d=false;
%通过迭代求最佳阈值
while~d
g=B>=T;
Tn=0.5*(mean(B(g))+mean(B(~g)));
d=abs(T-Tn)<0.5;
T=Tn;
end
% 根据最佳阈值进行图像分割
level=Tn;
for i=1:1024
for j=1:1024
if image_med(i,j)>=level
BW_Original(i,j)=1;
else
BW_Original(i,j)=0;
end
end
end
%%%%%%%迭代法%%%%%%%%%%%%%
imshow(BW_Original)
%%%%%%%二值化%%%%%%%%%%%%%
%%%%%%%zhangthinning%%%%%%%%%%%%%
changing = 1;
[rows, columns] = size(BW_Original);
BW_Thinned = BW_Original;
BW_Del = ones(rows, columns);
while changing
% BW_Del = ones(rows, columns);
changing = 0;
% Setp 1
for i=2:rows-1
for j = 2:columns-1
P = [BW_Thinned(i,j) BW_Thinned(i-1,j) BW_Thinned(i-1,j+1) BW_Thinned(i,j+1) BW_Thinned(i+1,j+1) BW_Thinned(i+1,j) BW_Thinned(i+1,j-1) BW_Thinned(i,j-1) BW_Thinned(i-1,j-1) BW_Thinned(i-1,j)]; % P1, P2, P3, ... , P8, P9, P2
if (BW_Thinned(i,j) == 1 && sum(P(2:end-1))<=6 && sum(P(2:end-1)) >=2 && P(2)*P(4)*P(6)==0 && P(4)*P(6)*P(8)==0) % conditions
% No. of 0,1 patterns (transitions from 0 to 1) in the ordered sequence
A = 0;
for k = 2:size(P,2)-1
if P(k) == 0 && P(k+1)==1
A = A+1;
end
end
if (A==1)
BW_Del(i,j)=0;
changing = 1;
end
end
end
end
BW_Thinned = BW_Thinned.*BW_Del; % the deletion must after all the pixels have been visited
% Step 2
% for i=2:rows-1
% for j = 2:columns-1
% P = [BW_Thinned(i,j) BW_Thinned(i-1,j) BW_Thinned(i-1,j+1) BW_Thinned(i,j+1) BW_Thinned(i+1,j+1) BW_Thinned(i+1,j) BW_Thinned(i+1,j-1) BW_Thinned(i,j-1) BW_Thinned(i-1,j-1) BW_Thinned(i-1,j)];
% if (BW_Thinned(i,j) == 1 && sum(P(2:end-1))<=6 && sum(P(2:end-1)) >=2 && P(2)*P(4)*P(8)==0 && P(2)*P(6)*P(8)==0) % conditions
% A = 0;
% for k = 2:size(P,2)-1
% if P(k) == 0 && P(k+1)==1
% A = A+1;
% end
% end
% if (A==1)
% BW_Del(i,j)=0;
% changing = 1;
% end
% end
% end
% end
BW_Thinned = BW_Thinned.*BW_Del;
end
%while
%%%%%%%zhangthinning%%%%%%%%%%%%%
%%%%%%%%%%变成单像素%%%%%%%%%%
%
% for i=2:rows-1
% for j = 2:columns-1
% P = [BW_Thinned(i,j) BW_Thinned(i-1,j) BW_Thinned(i-1,j+1) BW_Thinned(i,j+1) BW_Thinned(i+1,j+1) BW_Thinned(i+1,j) BW_Thinned(i+1,j-1) BW_Thinned(i,j-1) BW_Thinned(i-1,j-1) BW_Thinned(i-1,j)]; %%%八邻域
% %%检验是否符合90度模板%%%%
% if BW_Thinned(i,j)==1 && BW_Thinned(i-1,j)==1;
% end
% %%检验是否符合90度模板%%%%
% end
% end
%%%%%%%%%%变成单像素%%%%%%%%%%
figure
subplot(1,2,1)
imshow(BW_Original)
subplot(1,2,2)
imshow(BW_Thinned)