最簡單的方法是用matlab自帶的函式:
bw2 = bwmorph(bw,'thin',n);
n是要細化迭代的次數,也可以是inf(沒有引號)。inf表示演算法會一直迭代直到影象不再改變。
演算法原理參考 [1]。
zhang-suen演算法
原理簡介:
演算法實現:
將下列三個m檔案和主m檔案放到一起,主m檔案這樣呼叫:bw2=zs(bw1);
zs.m
%zs.m
function
out=zs
(im)
%%be binary.
%luteven=makelut('zseven',3);
lutodd=makelut('zsodd',3);
done=0;
n=2;
last=im;
while done==0,
if all(current(:)==last(:)),
done=1;
endn=n+1;
last=previous;
previous=current;
ifmod(n,2)==0,
else
end;
end;
out=current;
end
zseven.m
%zseven.m
function
out=zseven
(nbhd)
s=sum(nbhd(:))-nbhd(5);
temp1=(2
<=s)&&(s<=6);
p=[nbhd(1) nbhd(4) nbhd(7) nbhd(8) nbhd(9) nbhd(6) nbhd(3) nbhd(2)];
pp=[p(2:8) p(1)];
xp=sum((1-p).*pp);
temp2=(xp==1);
prod1=nbhd(4)*nbhd(8)*nbhd(2);
prod2=nbhd(4)*nbhd(6)*nbhd(2);
te***=(prod1==0)&&(prod2==0);
if temp1&temp2&te***&nbhd(5)==1
out=0;
else
out=nbhd(5);
end;
end
zsodd.m
%zsodd.m
function
out=zsodd
(nbhd)
s=sum(nbhd(:))-nbhd(5);
temp1=(2
<=s)&&(s<=6);
p=[nbhd(1) nbhd(4) nbhd(7) nbhd(8) nbhd(9) nbhd(6) nbhd(3) nbhd(2)];
pp=[p(2:8) p(1)];
xp=sum((1-p).*pp);
temp2=(xp==1);
prod1=nbhd(4)*nbhd(8)*nbhd(6);
prod2=nbhd(8)*nbhd(6)*nbhd(2);
te***=(prod1==0)&&(prod2==0);
if temp1&temp2&te***&nbhd(5)==1
out=0;
else
out=nbhd(5);
end;
end
參考[2]中骨架化的演算法,不知道是演算法寫錯了,還是本來**就沒有論述清楚,總是會把左上角給弄斷,先記在下面,以後再改吧。
%外圍擴充套件邊界
[h,w] = size(i);
i = [zeros(2,w);i;zeros(2,w)];
i = [zeros(h+4,2),i,zeros(h+4,2)];
[h,w] = size(i);
for k = 1:10
%迭代次數
p = zeros(8,1);
nzi = zeros(h,w);
zi = zeros(h,w);
p024i = zeros(h,w);
p246i = zeros(h,w);
i2 = i;
fori = 2:h-1
forj = 2:w-1
if i(i,j)
p(1) = i(i,j+1);
p(2) = i(i-1,j+1);
p(3) = i(i-1,j);
p(4) = i(i-1,j-1);
p(5) = i(i,j-1);
p(6) = i(i+1,j-1);
p(7) = i(i+1,j);
p(8) = i(i+1,j+1);
nzi(i,j) = sum(p);
zi(i,j) = sum(abs(diff(p)))+abs(p(8)-p(1));
p024i(i,j) = p(1) * p(3) * p(5);
p246i(i,j) = p(3) * p(5) * p(7);
endendend
fori = 3:h-1
forj = 3:w-1
if i(i,j)
if ((nzi(i,j) >= 2) && (nzi(i,j) <= 6)) && ...
(zi(i,j) == 2) && ...
((p024i(i,j)==0)||(zi(i,j-1)~=2)) && ...
((p246i(i,j)==0)||(zi(i-1,j)~=2))
i2(i,j) = 0;
endendend
endi = i2;
endfigure(1);
subplot(121);
imshow(isrc);
subplot(122);
imshow(i2);
[1]: lam, l., seong-whan lee, and ching y. suen, 「thinning methodologies-a comprehensive survey,」 ieee transactions on pattern analysis and machine intelligence, vol 14, no. 9, september 1992, page 879, bottom of first column through top of second column.
[2]周鳳香. 工業生產線標籤字元識別系統的設計與實現[d].電子科技大學,2013.
並行Zhang細化演算法FPA演算法
並行zhang細化演算法 和 fpa演算法 的規則好像完全一樣。p9 p2 p3 p8 p1 p4 p7 p6 p5 前景點為1,背景點為0 條件1 p1為前景點 條件2 8鄰域的點數 2且 6。條件3 8領域01模式數為1。條件4 p2 p4 p6 0 條件5 p4 p6 p8 0 條件6 p2 ...
c opencv中線條細化演算法
要達到的效果就是將線條盡量細化成單畫素,按照 上的hilditch演算法試了一下,發現效果不好,於是自己嘗試著寫了一下細化的演算法,基本原理就是從上下左右四個方向向內收縮。1.先是根據中的原則確定了以下16種情況 2.除錯過後發現,迭代次數多了之後,原來連線著的線條會斷開,分析原因如下圖 3.修改了...
OpenCV學習 18 細化演算法 6
本章我們在學習一下基於索引表的細化演算法。假設要處理的影象為二值圖,前景值為1,背景值為0。索引表細化演算法使用下面的8鄰域表示法 乙個畫素的8鄰域,我們可以用8位二進位制表示,比如下面的8鄰域,表示為00111000 0x38 56 我們可以列舉出各種情況下,當前畫素能否刪除的表,該錶大小為256...