細化演算法matlab

2021-07-10 15:05:27 字數 3531 閱讀 9272

最簡單的方法是用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...