c opencv中線條細化演算法

2022-08-26 07:15:11 字數 2567 閱讀 5588

要達到的效果就是將線條盡量細化成單畫素,按照**上的hilditch演算法試了一下,發現效果不好,於是自己嘗試著寫了一下細化的演算法,基本原理就是從上下左右四個方向向內收縮。

1.先是根據中的原則確定了以下16種情況

2.除錯過後發現,迭代次數多了之後,原來連線著的線條會斷開,分析原因如下圖

3.修改了一下判斷條件

4.除錯過後發現還是會出現斷的地方,再次分析原因如下圖

5.又加了判斷條件,如下圖

最終實現的效果如下

對比圖對規則曲線的效果比較好

但是圓的效果不太好,有待改進

附上**,測試了一天,終於弄完了,啊哈哈哈!然而後面還有更艱苦的路要走。加油!!!

1

//四周細化演算法

2void refine(mat&image)336

if (p[2] && (p[1] || p[3] || p[0] || p[4]) && !( p[5] || p[7]) && p[6] == 0)37

40}41}

42}4344

for (int i = 1; i < height - 2; i++)

4553

if (get_gray(im, 0, i - 1) == 0 && get_gray(im, 1, i + 1) && get_gray(im, 1, i) == 0 && get_gray(im, 0, i+2))//

上1=0,下1,右下1,右1=0,下2

5457}58

if (grayvalue != 0)59

64if (get_gray(im, width - 1, i - 1) == 0 && get_gray(im, width - 2, i + 1) && get_gray(im, width - 2, i) == 0 && get_gray(im, width - 1, i + 2))//

上1=0,下1,左下1,左1=0,下2

6568}69

}70for (int i = 0; i < del.size();i++)

7175

76//

左右收縮

77for (int i = 1; i < height - 1; i++)

78103

if (p[4] && (p[3] || p[5] || p[2] || p[6]) && !(p[1] || p[7]) && p[0] == 0

)104

107108

}109

}110

}111

112for (int j = 1; j < width - 2; j++)

113121

if (get_gray(im, j - 1, 0) && get_gray(im, j+1, 0)==0 && get_gray(im, j, 1) == 0 && get_gray(im, j-1, 1))//

左1,右1=0,下1=0,左下1

122125

}126

}127

for (int j = 1; j < width - 2; j++)

128136

if (get_gray(im, j - 1, height - 1) && get_gray(im, j + 1, height - 1) == 0 && get_gray(im, j, height - 2) == 0 && get_gray(im, j - 1, height - 2))//

左1,右1=0,下1=0,左下1

137140

}141

}142

143for (int i = 0; i < del.size(); i++)

144148 }

改進後的線條細化演算法

原來每次遍歷都是一整張圖,現在每次都記錄下需要操作的起始位置,下一次直接遍歷起始位置就可以了。原來的演算法執行100次的時間為3.901秒 改進後的時間為0.148秒 如下 1 四周細化演算法 2void refinenew mat image,int num 318 用於存放每一列需要處理影象的高...

Unity C OpenDRIVE中線條的實現

最近在做地圖相關的專案,研究了一下opendrive,這篇文章主要記錄了opendrive中的幾類線條的實現,分享給大家,希望對大家有所幫助。opendrive中主要的線條有以下幾種 直線 line 弧線 arc 螺旋線 spiral 只要有這三類線條便可以畫出路的引用線 reference lin...

細化演算法matlab

最簡單的方法是用matlab自帶的函式 bw2 bwmorph bw,thin n n是要細化迭代的次數,也可以是inf 沒有引號 inf表示演算法會一直迭代直到影象不再改變。演算法原理參考 1 zhang suen演算法 原理簡介 演算法實現 將下列三個m檔案和主m檔案放到一起,主m檔案這樣呼叫 ...