1. DBSCAN算法原理
首先介紹該算法的主要概念與參數:
(1) ε值:樣本與樣本之間的距離閾值,如果樣本A與樣本B的距離小於該閾值,則認為樣本A在樣本B的鄰域內,同時樣本B也在樣本A的鄰域內。
(2) minPts:每一個樣本的鄰域內樣本數閾值,如果該樣本鄰域內的樣本數大於等於該閾值,則認為該樣本是核心點。
(3) 核心點:即鄰域內的樣本數大於等於minPts的樣本。如下圖所示,如果樣本A的鄰域內(以A為圓心的圓內)樣本數達到minPts以上,則認為A為核心點。

(4) 樣本距離:歐式距離與曼哈頓距離是兩種很常見的衡量數據樣本距離的指標,假設有樣本A(a1,a2,...,an)和樣本B(b1,b2,...,bn),那么A與B的歐式距離為:

曼哈頓距離為:

(5) 樣本的訪問標記:一開始將所有樣本的標記設置為-1,表示所有樣本都沒有被訪問。算法執行過程中,會遍歷一遍所有樣本,經過遍歷的樣本則將其標記置1,表示該樣本已經被訪問過,不用再處理。
(6) 樣本的類編號:設置一個初始類編號為-1,分類過程中,每新增一個類,類編號加1。每當一個樣本被歸類到某一個類之后,該樣本的類編號則設置為當前新增的類編號。所以可以通過判斷該樣本的類編號是否為-1來判斷其是否已經被歸類。
DBSCAN算法的核心思想是,判斷每一個樣本是不是核心點,如果是核心點,則對該樣本及其鄰域內的樣本進行分類處理,具體處理流程如下:

下面我們使用C++和opencv實現DBSCAN算法,對灰度圖像進行分類。樣本就是灰度圖像的每一個像素點,可以把每一個像素點看成一個三維向量,由x坐標、y坐標、像素值I(x,y)組成[x, y, I(x,y)]。為了簡化計算,我們使用曼哈頓距離來計算各樣本之間的距離。
