1 距離變換
以Opencv的distanceTransform
距離變換為例。
1.1 梗概
計算圖像中每一個非零點
距離離自己最近
的零點
的距離,distanceTransform的第二個Mat矩陣參數dst保存了每一個點與最近的零點的距離信息,圖像上越亮的點
,代表了離零點的距離越遠
。
1.2 詳解
1.2.1 變換
Distance fields can also be signed, in the case where it is important to distinguish whether the point is inside or outside of the shape.[1]
Usually the transform/map is qualified with the chosen metric. For example, one may speak of Manhattan distance transform, if the underlying metric is Manhattan distance
上方翻譯具體表達:
距離變換可以表示區分改點在幾何圖形的內部或外部。(根據變換后的距離值)
變換圖常用度量標準,例如曼哈頓距離
歐式距離也可以,但是歐式距離不長用于距離變換中(Euclidean Metric)
1.2.1.1 下圖為歐式距離和曼哈頓距離的區別
image.png
1.2.1.2 距離變換 (曼哈頓距離(Manhattan distance)標準講解)
以二值圖像為例,計算0到非0的距離;其中區域塊內部的像素值為1,其他像素值為0。距離變換給出每個像素點到最近的區域塊邊界的距離,區域塊內部的距離變換結果為0。輸入圖像如圖1所示,D4距離的距離變換結果如圖2所示。
image
image.png
image
具體的距離變換的距離計算可以多種多樣,只是不同方法性能不一。
常用『掩模』
1.2.2 舉例
變換前(二值化/開運算)
before distance transform
變換后
distanceTransform
1.3 用途
1.3.1 watershed 分水嶺算法 ( 細化輪廓 )
image.png
image.png
image.png
image.png
前方開運算+腐蝕(去除噪點和非必要連接處)+膨脹(消化腐蝕影響)- 記為A
距離變換,求曼哈頓距離 - 記為B
二值化,細化具體輪廓 - 記為C
A - C = D (邊界)
創建標記(marker,它是一個與原始圖像大小相同的矩陣,int32數據類型),表示其中的每個區域。分水嶺算法將標記的0的區域視為不確定區域,將標記為1的區域視為背景區域,將標記大于1的正整數表示我們想得到的前景 (使用 cv2.connectedComponents() 來實現這個功能) (
連接組件標記算法(connected component labeling algorithm)是圖像分析中最常用的算法之一,算法的實質是掃描二值圖像的每個像素點,對于像素值相同的而且相互連通分為相同的組(group),最終得到圖像中所有的像素連通組件。
)E = connectedComponents(
C
)
連通處理之后返回的標記圖像
cv2.connectedComponents
# 去重后的標記區域的點
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 34, 36, 32, 33, 35, 37]
連通標記之后 plt.show.png
F =
E
+1 , 分水嶺對所有標注都要>1F[
D
=255(邊界)] = 0 (背景區域)所以 F[F>1] 前景 ;F[F=1] 未知區域 ;F[F=0] 背景
Add one to all labels so that sure background is not 0, but 1
D = watershed(img, F)
1.3.2 細化輪廓和查找物體質心
image.png
image.png
1.4 其他
1.5 參考文獻
- 距離變換
https://en.wikipedia.org/wiki/Distance_transform - 曼哈頓距離
https://en.wikipedia.org/wiki/Taxicab_geometry - 距離變換分水嶺
https://imagej.net/Distance_Transform_Watershed - Opencv connectedComponents函數 連通區域
https://docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#gaedef8c7340499ca391d459122e51bef5 - 知乎 分水嶺opencv
https://zhuanlan.zhihu.com/p/67741538
2 OTSU二值化算法 (類間方差)
是日本學者大津(OTSU)提出來的
2.1 梗概
大津法(OTSU)是一種確定圖像二值化分割閾值的算法,由日本學者大津于1979年提出
2.2 詳解
2.2.1 算法過程
轉灰度圖
創建直方圖 Histograms
直方圖平滑 Histograms_smooth
注意:以下均需要loop 0~255 像素點(和直方圖)
i代表當前loop item的灰度值,p(i) 代表該灰度值所在直方圖的點數
均需要歸一化[0,1]
-
前景圖像總點數w0,后景圖像總點數w1
image.png -
前景平均灰度值u0 ,景平均灰度值u1,總灰度值uT(質量矩)
image.png
對應關系
image.png -
求類間方差
前景 * ()
image.png 取
最大類間方差
時對應的灰度的i
就是最佳閾值
說白了就是一張圖下, [0,t) , [t,255] 分別代表前景,后景的兩個區間分兩類,
然后分別求對于質量矩的方差所決定的最佳閾值。
(其中還有`前景總點數(權重)`和后景的乘積有關系)
2.2.2 過程圖示
2.3 使用
2.3.1 二值化圖像
image.png
image.png