OpenCV c++

图像像素距离变换

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值