opencv學習筆記(三十六)距離變換

2021-07-28 10:37:45 字數 2348 閱讀 5716

距離變換cvdisttransform()

距離變換於2023年被學者首次提出,目前已被廣泛應用於影象分析、計算機視覺、模式識別等領域,人們利用它來實現目標細化、骨架提取、形狀插值及匹配、粘連物體的分離等。距離變換是針對二值影象的一種變換。在二維空間中,一幅二值影象可以認為僅僅包含目標和背景兩種畫素,目標的畫素值為1,背景的畫素值為0;距離變換的結果不是另一幅二值影象,而是一幅灰度級影象,即距離影象,影象中每個畫素的灰度值為該畫素與距其最近的背景畫素間的距離。

現有的距離變換演算法主要採用兩類距離測度:非歐式距離和歐式距離。前者常用的有城市擷取、棋盤、倒角等距離,演算法採用序列掃瞄實現距離變換,在掃瞄過程中傳遞最短距離資訊。這些演算法簡單快速,易於實現,但得到的僅僅是歐式距離變換(edt)的一種近似值,在很多應用中不能滿足精度要求,必須使用edt,為此,很多學者也在研究高效快速的真實edt演算法。

定義:

void cvdisttransform

( const cvarr* src,

cvarr* dst,

int distance_type=cv_dist_l2,

int mask_size=3,

const float* mask=null

); 引數:

src

輸入 8-位元、單通道 (二值) 影象. source image must be 8uc1

dst

含計算出的距離的輸出影象(32-位元、浮點數、單通道). the distance map must be 32fc1

distance_type

距離型別; 可以是 cv_dist_l1, cv_dist_l2, cv_dist_c 或 cv_dist_user.

mask_size

距離變換掩模的大小,可以是 3 或 5.

對 cv_dist_l1 或 cv_dist_c 的情況,引數值被強制設定為 3, 因為 3×3 mask 給出 5×5 mask 一樣的結果,而且速度還更快。

mask

使用者自定義距離情況下的 mask。 在 3×3 mask 下它由兩個數(水平/垂直位量,對角線位移量)組成, 5×5 mask 下由三個數組成(水平/垂直位移量,對角位移和 西洋棋裡的馬步(馬走日)) 。

函式 cvdisttransform 二值影象每乙個象素點到它最鄰近零象素點的距離。對零象素,函式設定 0 距離,對其它象素,它尋找由基本位移(水平、垂直、對角線或knight』s move,最後一項對 5×5 mask 有用)構成的最短路徑。 全部的距離被認為是基本距離的和。由於距離函式是對稱的,所有水平和垂直位移具有同樣的代價 (表示為 a ), 所有的對角位移具有同樣的代價 (表示為 b), 所有的 knight』s 移動具有同樣的代價 (表示為 c). 對型別 cv_dist_c 和 cv_dist_l1,距離的計算是精確的,而型別 cv_dist_l2 (歐式距離) 距離的計算有某些相對誤差 (5×5 mask 給出更精確的結果), opencv 使用推薦的值:

cv_dist_c (3×3):

a=1, b=1

cv_dist_l1 (3×3):

a=1, b=2

cv_dist_l2 (3×3):

a=0.955, b=1.3693

cv_dist_l2 (5×5):

a=1, b=1.4, c=2.1969

典型的使用快速粗略距離估計 cv_dist_l2, 3×3 mask , 如果要更精確的距離估計,使用 cv_dist_l2, 5×5 mask。

提取手掌重心(用到距離變換)**

#include #include int main()

if(s>0)

cvpoint pos = cvpoint((int)x,(int)y);

cvcircle(src_image,pos,3,cv_rgb(255,0,0),1,cv_aa);

cvshowimage("src",src_image);

cvwaitkey(-1);

cvdestroywindow("src");

cvreleaseimage(&src_image);

cvreleaseimage(&gray_image);

cvreleaseimage(&bi_src);

cvreleaseimage(&dist8u_image);

cvreleaseimage(&bi_dist);

return

0;}

用到的

C 學習筆記 三十六 命名空間

在 c 應用程式中。例如,您可能會寫乙個名為 xyz 的函式,在另乙個可用的庫中也存在乙個相同的函式 xyz 這樣,編譯器就無法判斷您所使用的是哪乙個 xyz 函式。因此,引入了命名空間這個概念,專門用於解決上面的問題,它可作為附加資訊來區分不同庫中相同名稱的函式 類 變數等。使用了命名空間即定義了...

python學習 三十六 wxpython

pycharm 裡安裝wxpython 並且用pyinstaller打包 1 pycharm,file setting project interpreter,點選加號,安裝wxpython,然後安裝pyinstaller.2 建立乙個檔案 gui.py,寫乙個hello world的wxpytho...

Python零基礎學習筆記(三十六) 遞迴

遞迴呼叫 乙個函式,呼叫了自身,成為遞迴呼叫 遞迴函式 乙個會呼叫自身的函式 凡是迴圈能幹的事,遞迴都能幹 方式 1 寫出臨界條件 2 找這一次和上一次的關係 3 假設當前函式已經能用,呼叫自身計算行一次的結果,再求出本次的結果 輸入乙個數,求 1 2 3 n 的和 def sum1 n sum 0...