距离变换的处理图像通常都是二值图像。
一、背景和物体
- 二值图像其实就是把图像分为两部分,即背景和物体两部分,物体通常又称为前景目标。
- 通常我们把前景目标的灰度值设为255(即白色),背景的灰度值设为0(即黑色)。
二、距离值替换像素值
- 所以定义中的非零像素点即为前景目标,零像素点即为背景。
- 所以图像中前景目标中的像素点距离背景越远,那么距离就越大。
如果我们用这个距离值替换像素值,那么新生成的图像中这个点越亮。
三、三种距离
-
1、欧式距离:
表示距离小于等于某一个值的像素中心(x,y)且半径为R的圆平面。
-
2、棋盘距离:
数字栅格上像素按照对角线方向移动形成的距离。
-
3、曼哈顿距离:
从起点到终点所需要的最小步数,只允许横向移动和纵向移动。
四、函数distanceTransform()
- OpenCV中,函数distanceTransform()用于计算图像中每一个非零点像素与其最近的零点像素之间的距离,
输出的是保存每一个非零点与最近零点的距离信息,图像上越亮的点,代表了离零点的距离越远。 - 用途:
可以根据距离变换的这个性质,经过简单的运算,用于细化字符的轮廓和查找物体质心(中心)。
L1: 曼哈顿距离
L2: 欧式距离
C: 棋盘距离
五、程序
private void button4_Click(object sender, EventArgs e)
{
Mat src = src_img.Clone();
Cv2.ImShow("原图", src);
Mat tran = new Mat();
Mat normalize = new Mat();
// 灰度转换
Mat gray = new Mat();
Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
Cv2.BitwiseNot(gray, gray);
Cv2.ImShow("按位运算 取反", gray);
// 距离变换
Cv2.DistanceTransform(gray, tran, DistanceTypes.L2, DistanceMaskSize.Mask3);
Cv2.Normalize(tran, normalize, 0, 1, NormTypes.MinMax);
normalize.ConvertTo(dst, MatType.CV_8U, 256);
Cv2.ImShow("归一化", dst);
//pictureBox1.Image = dst.ToBitmap();
}
六、资料
蒋智昊的博客
http://chanpinxue.cn/archives/5118.html
网友评论