图像像素距离变换
distanceTransform(imgBW, dist, 1, 3, CV_32F);
一、输入图像,CV_8U灰度图
二、输出图像,尺寸与输入图像相同,数据类型为CV_8U或CV_32F
三、计算两个像素间距离方法的标志
四、距离变换掩码矩阵尺寸,欧氏距离:5*5精确,3*3粗略;街区距离:3*3快,5*5慢
五、输出数据类型
注:由于distanceTransform()函数是计算图像中非零像素距离0像素的最小距离,0像素是黑色,所以不建议用尺寸过小或者黑色区域较多的图像,否则不利于观察。
#include<opencv2/opencv.hpp>
#include<quickopencv.h>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
//构建简易矩阵,用于求取像素之间的距离
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;
//对图像进行距离变换
Mat img = imread("D:/images/dog.png", IMREAD_ANYDEPTH);
if (img.empty()) {
cout << "请确认图像文件名称正确!" << endl;
return -1;
}
Mat imgBW,imgBW_INV;
//把图像转成二值图像,同时把黑白区域互换
threshold(img, imgBW, 50, 255, THRESH_BINARY);
threshold(img, imgBW_INV, 50, 255, THRESH_BINARY_INV);
//距离变换
Mat dist, dist_INV;
distanceTransform(imgBW, dist, 1, 3, CV_32F);
distanceTransform(imgBW_INV, dist_INV, 1, 3, CV_8U);
imshow("imgBW", imgBW);
imshow("dist", dist);
imshow("imgBW_INV", imgBW_INV);
imshow("dist_INV", dist_INV);
waitKey(0);//此时图片显示时间为一直停留。(x)为x毫秒
destroyAllWindows();
return 0;
}