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