要達到的效果就是將線條盡量細化成單畫素,按照**上的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檔案這樣呼叫 ...