圖像矩
moments(
InputArray array,//輸入數據
bool binaryImage=false // 是否爲二值圖像
)
面積
contourArea(
InputArray contour,//輸入輪廓數據
bool oriented// 默認false、返回絕對值)
弧長
arcLength(
InputArray curve,//輸入曲線數據
bool closed// 是否是封閉曲線)
過程:
提取圖像邊緣
發現輪廓
計算每個輪廓對象的矩
計算每個對象的中心、弧長、面積
點多邊形測試
測試一個點是否在給定的多邊形內部,邊緣或者外部
pointPolygonTest(
InputArray contour,// 輸入的輪廓
Point2f pt, // 測試點
bool measureDist // 是否返回距離值,如果是false,1表示在內面,0表示在邊界上,-1表示在外部,true返回實際距離
返回數據是double類型)
基於距離變換與分水嶺的圖像分割
cv::distanceTransform(InputArray src, OutputArray dst, OutputArray labels, int distanceType, int maskSize, int labelType=DIST_LABEL_CCOMP)
distanceType = DIST_L1/DIST_L2,
maskSize = 3x3,最新的支持5x5,推薦3x3、
labels離散維諾圖輸出
dst輸出8位或者32位的浮點數,單一通道,大小與輸入圖像一致
cv::watershed(InputArray image, InputOutputArray markers)
流程
1.將白色背景變成黑色-目的是爲後面的變換做準備
2. 使用filter2D與拉普拉斯算子實現圖像對比度提高,sharp
3. 轉爲二值圖像通過threshold
4. 距離變換
5. 對距離變換結果進行歸一化到[0~1]之間
6. 使用閾值,再次二值化,得到標記
7. 腐蝕得到每個Peak - erode
8.發現輪廓 – findContours
9. 繪製輪廓- drawContours
10.分水嶺變換 watershed
11. 對每個分割區域着色輸出結果