道格拉斯 普克演算法

2021-08-01 08:19:58 字數 2726 閱讀 5998

該演算法也以douglas-peucker演算法和迭代終點擬合演算法為名。演算法的目的是給出由線段組成的曲線(在某些上下文中也稱為折線),以找到具有較少點的相似曲線。 該演算法基於原始曲線和簡化曲線(即曲線之間的豪斯多夫距離)之間的最大距離定義「不相似」。 簡化曲線由定義原始曲線的點的子集組成。

演算法描述如下:

起始曲線是有序的一組點或線,距離維度ε> 0。該演算法遞迴地劃分線。 最初給出了第一點和最後一點之間的所有點。 它會自動標記要儲存的第乙個和最後乙個點。 然後找到距離第一點和最後一點組成的線段的最遠的點作為終點; 這一點在距離終點之間的近似線段的曲線上顯然最遠。 如果該點比線段更接近於ε,那麼當前未被標記的任何點將被儲存,而沒有簡化的曲線比ε更差的可以丟棄。

如果離線段最遠的點距離近似值大於ε,則必須保留該點。 該演算法以第乙個點和最遠點遞迴地呼叫自身,然後以最遠點和最後乙個點(包括最遠點被標記為保留)遞迴呼叫自身。

當遞迴完成時,可以生成乙個新的輸出曲線,其中包括所有且僅標記為保留的點。

非引數ramer-douglas-peucker 

ε的選擇通常是使用者定義的。 像大多數線擬合/多邊形近似/主點檢測方法一樣,通過使用由於數位化/量化的誤差界限作為終止條件,可以使其非引數化[1] 這種非引數rdp演算法[2]的matlab**在這裡可用[3]

偽**:

假設輸入是基於一一陣列

function douglaspeucker(pointlist, epsilon)

// find the point with the maximum distance

dmax = 0

index = 0

end = length(pointlist)

for i = 2 to ( end - 1)

}// if max distance is greater than epsilon, recursively simplify

if ( dmax > epsilon )

} else

}// return the result

return resultlist

end

該演算法用於處理向量圖形 和製圖綜合。該演算法廣泛應用於機械人技術[4]中,對旋轉量程掃瞄器採集的範圍資料進行簡化和去噪; 在這個領域中,它被稱為**合併演算法,歸因於duda和hart。

該演算法的複雜度可以利用線性遞迴來描述t(n

) = 2t(

n⁄2) + o(

n),其具有t(n)∈θ(n log n)的公知解決方案(通過主定理)。

然而,最壞情況的複雜度是θ(n2)。

#include "opencv2/imgproc.hpp"

#include "opencv2/highgui.hpp"

#include

#include

using namespace cv;

using namespace std;

static void help()

const int w = 500;

int levels = 3;

vector

> contours;

vector

hierarchy; static void on_trackbar(int,void*) int main( int argc, char** argv) "); if (parser.has("help")) mat img = mat::zeros(w, w, cv_8uc1); //draw 6 faces for( int i = 0; i < 6; i++ ) } ellipse( img, point(dx+150, dy+100),size(100,70),0, 0, 360, white, -1,8, 0 ); ellipse( img, point(dx+115, dy+70),size(30,20),0, 0, 360, black, -1,8, 0 ); ellipse( img, point(dx+185, dy+70),size(30,20),0, 0, 360, black, -1,8, 0 ); ellipse( img, point(dx+115, dy+70),size(15,15),0, 0, 360, white, -1,8, 0 ); ellipse( img, point(dx+185, dy+70),size(15,15),0, 0, 360, white, -1,8, 0 ); ellipse( img, point(dx+115, dy+70),size(5,5),0, 0, 360, black, -1,8, 0 ); ellipse( img, point(dx+185, dy+70),size(5,5),0, 0, 360, black, -1,8, 0 ); ellipse( img, point(dx+150, dy+100),size(10,5),0, 0, 360, black, -1,8, 0 ); ellipse( img, point(dx+150, dy+150),size(40,10),0, 0, 360, black, -1,8, 0 ); ellipse( img, point(dx+27, dy+100),size(20,35),0, 0, 360, white, -1,8, 0 ); ellipse( img, point(dx+273, dy+100),size(20,35),0, 0, 360, white, -1,8, 0 ); } //show the faces namedwindow( "image",1 ); imshow( "image", img ); //extract the contours so that vector

道格拉斯 普克演算法

意圖 是將曲線近似表示為一系列點,並減少點的數量的一種演算法。它的優點是具有平移和旋轉不變性,給定曲線與閾值後,抽樣結果一定。具體步驟 1 在曲線首尾兩點間虛連一條直線,求出其餘各點到該直線的距離,如右圖 1 2 選其最大者與閾值相比較,若大於閾值,則離該直線距離最大的點保留,否則將直線兩端點間各點...

C 實現道格拉斯 普克演算法設計

namespace dog public struct line public line parameter mypoint p1,mypoint p2 public double distance mypoint dot,line cs public form1 private void form...

一種改進的道格拉斯 普克演算法以及C 實現

分類 地圖 地理資料 2012 05 10 21 55 1431人閱讀收藏 舉報演算法 douglas一peukcer演算法由d.douglas和t.peueker於1973年提出,簡稱d一p演算法,是目前公認的線狀要素化簡經典演算法。現有的線化簡演算法中,有相當一部分都是在該演算法基礎上進行改進產...