像素间距离
像素间的距离计算的是非零像素距离零像素的长度。
欧式距离
街区距离
棋盘距离
距离变换函数
distanceTransform()
cpp
void cv::distanceTransform(InputArray src,
OutputArray dst,
int distanceType,
int maskSize,
int dstType = CV_32F
)
·src:输入图像,数据类型为CV_8U的单通道图像。
·dst:输出图像,与输入图像具有相同尺寸,数据类型为CV_8U或者CV_32F的单通道图像。
·distanceType:选择计算两个像素之间距离方法的标志。
·maskSize:距离变换掩码矩阵大小,可以选择尺寸为DIST_MAASK_3(3*3),DIST_MASK_5(5*5)。
·dstType:输出图像的数据类型,可以是CV_8U或者CV_32F。
示例
cpp
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv; //opencv的命名空间
using namespace std;
//主函数
int main()
{
//构建建议矩阵,用于求取像素之间的距离
Mat a = (Mat_<uchar>(5, 5) << 1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 0, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1);
Mat dist_L1, dist_L2, dist_C, dist_L12;
//计算街区距离
distanceTransform(a, dist_L1, 1, 3, CV_8U);
cout << "街区距离" << endl << dist_L1 << endl;
//计算欧式距离
distanceTransform(a, dist_L2, 2, 5, CV_8U);
cout << "欧式距离" << endl << dist_L2 << endl;
//计算棋盘距离
distanceTransform(a, dist_C, 3, 5, CV_8U);
cout << "棋盘距离" << endl << dist_C << endl;
cout << "对图像进行距离变换" << endl;
waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出
//对图像进行距离变换
Mat img = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/hua.jpg");
if (img.empty())
{
cout << "请确认图像文件名是否正确" << endl;
return -1;
}
Mat hua, huaBW, huaBW_INV;
cvtColor(img, hua, COLOR_BGR2GRAY);//转为灰度图像
//将图像转为二值图像,同时把黑白区域颜色呼唤
threshold(hua, huaBW, 25, 255, THRESH_BINARY);
threshold(hua, huaBW_INV, 25, 255, THRESH_BINARY_INV);
//距离变换
Mat dist, dist_INV;
distanceTransform(huaBW, dist, 1, 3, CV_32F);//数据类型设置为32F时,所有大于1的数将全部为白色
distanceTransform(huaBW_INV, dist_INV, 1, 3, CV_8U);
//显示变换结果
imshow("huaBW", huaBW);
imshow("dist", dist);
imshow("huaBW_INV", huaBW_INV);
imshow("dist_INV", dist_INV);
waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出
return 0;
}