項目經(jīng)理證書怎么考廣州百度網(wǎng)站排名優(yōu)化
注意:新版本的opencv 4 已經(jīng)沒有這個函數(shù) cv2.createShapeContextDistanceExtractor()
形狀場景算法是一種用于比較輪廓或形狀的方法。這種算法通常用于計算兩個形狀之間的相似性或差異性,以及找到最佳的匹配方式。
下面是一種基本的比較輪廓的流程,使用了形狀場景算法:
-
數(shù)據(jù)準備: 首先,你需要準備兩個形狀的輪廓數(shù)據(jù)。輪廓可以表示為一系列的點坐標,或者更高級的表示方法,比如參數(shù)化的曲線等。
-
特征提取: 對于每個形狀,你可以使用形狀描述符或特征提取算法,將輪廓數(shù)據(jù)轉(zhuǎn)化為一組能夠表征形狀的數(shù)值特征。這些特征可以是形狀的曲率、長度、角度等等。
-
相似性度量: 選擇一個相似性度量方法來比較兩個形狀的特征。常見的方法包括歐氏距離、曼哈頓距離、余弦相似度等。這些度量方法將兩個形狀的特征轉(zhuǎn)化為一個相似性分數(shù),分數(shù)越高表示形狀越相似。
-
匹配與優(yōu)化: 如果你想要找到最佳的形狀匹配,可以使用優(yōu)化算法來調(diào)整一個形狀以使其與另一個形狀更加相似。這可能涉及到形狀的縮放、旋轉(zhuǎn)、平移等變換。
-
可視化與解釋: 最后,你可以可視化兩個形狀,展示它們的相似性以及在匹配過程中發(fā)生的變化。這可以通過繪制形狀、展示變換等方式來實現(xiàn)。
需要注意的是,形狀場景算法的選擇取決于你所處理的具體問題和數(shù)據(jù)。不同的算法可能在不同的場景下表現(xiàn)更佳。一些常用的形狀比較算法包括基于輪廓匹配的方法(如Frechet距離、Hausdorff距離)、基于特征的方法(如傅里葉描述符、輪廓矢量化等)、基于統(tǒng)計的方法(如Procrustes分析)等。
最終,選擇適合你問題需求的方法,并根據(jù)實際情況進行調(diào)整和優(yōu)化,以得到準確的形狀比較結(jié)果。
利用形狀場景算法比較輪廓與Hu 矩的區(qū)別
形狀場景算法和Hu矩都是用于比較輪廓或形狀的方法,但它們基于不同的原理和特征表示。
下面是它們之間的區(qū)別:
1. 原理和特征表示:
-
形狀場景算法: 形狀場景算法基于整個形狀的輪廓信息,通常通過提取一系列特征點的坐標來表示輪廓,然后計算這些特征點之間的幾何關(guān)系、曲率等信息。這些算法可以比較兩個形狀之間的形狀變化、縮放、旋轉(zhuǎn)等變換。
-
Hu矩: Hu矩是一組與形狀相關(guān)的不變矩,用于描述對象的整體形狀特征。它們通過對輪廓的幾何矩進行變換和歸一化得到。Hu矩是一種用于表示形狀的緊湊形式,能夠在一定程度上保持形狀的平移、旋轉(zhuǎn)和縮放不變性。
2. 不變性:
-
形狀場景算法: 形狀場景算法通常對形狀的幾何變換比較敏感,因此可能需要進行額外的處理來考慮形狀的平移、旋轉(zhuǎn)和縮放等變換。
-
Hu矩: Hu矩被設(shè)計用于保持一定的形狀不變性,它們對于平移、旋轉(zhuǎn)和縮放都具有一定程度的不變性。這使得Hu矩在某些形狀匹配和識別任務(wù)中非常有用。
3. 適用領(lǐng)域:
-
形狀場景算法: 形狀場景算法適用于需要考慮形狀變換以及局部特征的情況。例如,可以用于比較兩個形狀的整體結(jié)構(gòu)和曲率變化。
-
Hu矩: Hu矩適用于需要保持形狀不變性的場景,例如對象識別、圖像檢索等。它們能夠在一定程度上解決形狀的旋轉(zhuǎn)、平移和縮放變化對比較造成的影響。
OpenCV 提供了使用“距離”作為形狀比較的度量標準。這是因為形狀之間的差異值和距離有相似之處,比如二者都只能是零或者正數(shù),又比如當兩個形狀一模一樣時距離值和差值都等于零。
OpenCV 提供了函數(shù) cv2.createShapeContextDistanceExtractor()
,用于計算形狀場景距離。
其使用的“形狀上下文算法”在計算距離時,在每個點上附加一個“形狀上下文”描述符,讓每個點都能夠捕獲剩余點相對于它的分布特征,從而提供全局鑒別特征。
函數(shù) cv2.createShapeContextDistanceExtractor()的語法格式為:
retval = cv2.createShapeContextDistanceExtractor( [, nAngularBins[,
nRadialBins[, innerRadius[, outerRadius[, iterations[, comparer[,
transformer]]]]]]] )
式中的返回值為 retval,返回結(jié)果。
該結(jié)果可以通過函數(shù) cv2.ShapeDistanceExtractor.computeDistance()計算兩個不同形狀之間的距離。此函數(shù)的語法格式為:
retval=cv2.ShapeDistanceExtractor.computeDistance(contour1, contour2)
式中,coutour1 和 coutour2 是不同的輪廓。
函數(shù) cv2.createShapeContextDistanceExtractor()的參數(shù)都是可選參數(shù):
- nAngularBins:為形狀匹配中使用的形狀上下文描述符建立的角容器的數(shù)量。
- nRadialBins:為形狀匹配中使用的形狀上下文描述符建立的徑向容器的數(shù)量。
- innerRadius:形狀上下文描述符的內(nèi)半徑。
- outerRadius:形狀上下文描述符的外半徑。
- iterations:迭代次數(shù)。
- comparer:直方圖代價提取算子。該函數(shù)使用了直方圖代價提取仿函數(shù),可以直接采用
直方圖代價提取仿函數(shù)的算子作為參數(shù)。 - transformer:形狀變換參數(shù)。
示例:使用函數(shù) cv2.createShapeContextDistanceExtractor()計算形狀場景距離。
import cv2
#-----------原始圖像 o1 的邊緣--------------------
o1 = cv2.imread('cs.bmp')
cv2.imshow("original1",o1)
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
ret, binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)
contours1, hierarchy = cv2.findContours(binary1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)cnt1 = contours1[0]
#-----------原始圖像 o2 的邊緣--------------------
o2 = cv2.imread('cs3.bmp')
cv2.imshow("original2",o2)
gray2 = cv2.cvtColor(o2,cv2.COLOR_BGR2GRAY)
ret, binary2 = cv2.threshold(gray2,127,255,cv2.THRESH_BINARY)
contours2, hierarchy = cv2.findContours(binary2,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)cnt2 = contours2[0]
#-----------原始圖像 o3 的邊緣--------------------
o3 = cv2.imread('hand.bmp')
cv2.imshow("original3",o3)
gray3 = cv2.cvtColor(o3,cv2.COLOR_BGR2GRAY)
ret, binary3 = cv2.threshold(gray3,127,255,cv2.THRESH_BINARY)
contours3, hierarchy = cv2.findContours(binary3,cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
cnt3 = contours3[0]#-----------構(gòu)造距離提取算子--------------------
sd = cv2.createShapeContextDistanceExtractor()#-----------計算距離--------------------
d1 = sd.matchShapes(cnt1,cnt1)
print("與自身的距離 d1=", d1)
d2 = sd.matchShapes(cnt1,cnt2)
print("與旋轉(zhuǎn)縮放后的自身圖像的距離 d2=", d2)
d3 = sd.matchShapes(cnt1,cnt3)
print("與不相似對象的距離 d3=", d3)cv2.waitKey()
cv2.destroyAllWindows()
運行后報錯: