opencv_c++学习(十九)

一、图像间的距离变换

三种常用的距离计算方法:
在这里插入图片描述
欧式距离这里就不在解释。
街区距离:顾名思义,就类似于城市距离一样,并不是通过两点间的距离,而是我们从一个地点到达另一个地点的路程(横纵坐标差值之和)。
棋盘距离:是两点横纵坐标之差的最大值。
距离变换函数:

distanceTransform(InputArray src, OutputArray dst,int distanceType, int maskSize, int dstType = cv_32F)

src:输入图像,数据类型为CV_8U的单通道图像。
dst:输出图像,与输入图像具有相同的尺寸,数据类型为CV_8U或者CV_32F的单通道图像。
distanceType:选择计算两个像素之间距离方法的标志。
maskSize:距离变换掩码矩阵大小,可以选择尺寸为DIST_MASK_3(3×3)、DIST_MASK_5 (5×5)
dstType:输出图像的数据类型,可以是CV_8U或者CV_32F。
应用案例如下:

int main() {

	//定义一个建议矩阵,用于演示
	Mat a = (Mat_<uchar>(5, 5) << 1, 1, 1, 1, 1,
		1, 1, 1, 1, 11,
		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 << dist_L1 << endl;

	//计算欧式距离
	distanceTransform(a, dist_L2, 2, 5, CV_8U);
	cout << dist_L2 << endl;

	//计算棋盘距离
	distanceTransform(a, dist_C, 3, 5, CV_8U);
	cout << dist_C << endl;

	//对图像进行距离变换
	//读取图片
	Mat src = imread("图片1.png", IMREAD_GRAYSCALE);
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	Mat src_BW, srcBW_INV;

	//将图像转化为二值图像,同时把黑白区域颜色互换
	threshold(src, src_BW, 50, 255, THRESH_BINARY);
	threshold(src, srcBW_INV, 50, 255, THRESH_BINARY_INV);

	//根据距离变换进行距离计算
	Mat dist, dist_INV;

	//CV_32F可以使图像变的更清晰
	distanceTransform(src_BW, dist, 1, 3, CV_32F);
	distanceTransform(srcBW_INV, dist_INV, 1, 3, CV_8U);

	imshow("w", src_BW);

	waitKey(0); 
	return 0;
}

二、图像形态学——腐蚀操作

在这里插入图片描述
图像腐蚀原理:
在这里插入图片描述
将结构元素的中心点放置在非零像素中,如果结构元素覆盖的范围存在零像素。则删除此时结构元素中心点所在位置元素,再进行平移操作,以此类图。
函数接口:

getStructuringElement(int shape, Size ksize, Point anchor = point(-1,-1))

shape:结构元素的种类。
ksize:结构元素的尺寸大小
anchor:中心点的位置,默认参数为结构元素的几何中心点。
函数生成的结构元素如下:
在这里插入图片描述
图像腐蚀操作函数:

erode(lnputArray src, OutputArray dst, lnputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar & borderValue = morphologyDefaultBordervalue())

src:输入的待腐蚀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
dst:腐蚀后的输出图像,与输入图像src具有相同的尺办和数据类型。
kernel:用于腐蚀操作的结构元素,可以自己输入,也可以用getStructuringElement()函数生成。anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点。
iterations:腐蚀的次数。
borderType:像素外推法选择标志。
borderValue:边界不变的边界值。
图像腐蚀操作案例:

int main() {

	//读取图片
	Mat src = imread("图片1.png", IMREAD_ANYCOLOR);
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	Mat erode_black1, erode_black2;

	//开始图像腐蚀操作
	//定义结构元素
	Mat struct1, struct2;
	//3*3大小的矩形结构元素
	struct1 = getStructuringElement(0, Size(3, 3));
	//3*3大小的十字结构元素
	struct1 = getStructuringElement(1, Size(3, 3));

	//腐蚀操作
	erode(src, erode_black1, struct1);
	erode(src, erode_black2, struct2);

	imshow("w", erode_black1);
	imshow("q", erode_black2);

	waitKey(0);
	return 0;
}

三、图像形态学——膨胀操作

在这里插入图片描述
与图像腐蚀相反,这里就不再赘述。
结构元素生成函数:

getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1)

shape:结构元素的种类。
ksize:结构元素的尺寸大小
anchor:中心点的位置,默认参数为结构元素的几何中心点。
在这里插入图片描述
图像膨胀操作函数:

dilate(lnputArray src, OutputArray dst, lnputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_cONSTANT, const Scalar & borderValue = morphologyDefaultBordervalue())

src:输入的待膨胀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_160,cV_16S,cV_32F或CV_64F之一。
dst:腐蚀后的输出图像,与输入图像src具有相同的尺寸和数据类型。
kernel:用于膨胀操作的结构元素,可以自己输入,也可以用getStructuringElement()函数生成。anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点。
iterations:腐蚀的次数。
borderType:像素外推法选择标志。
borderValue:边界不变的边界值。
膨胀函数的使用案例:

int main() {

	//读取图片
	Mat src = imread("图片1.png", IMREAD_ANYCOLOR);
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	Mat erode_black1, erode_black2;

	//开始图像腐蚀操作
	//定义结构元素
	Mat struct1, struct2;
	//3*3大小的矩形结构元素
	struct1 = getStructuringElement(0, Size(3, 3));
	//3*3大小的十字结构元素
	struct1 = getStructuringElement(1, Size(3, 3));

	//膨胀操作
	dilate(src, erode_black1, struct1);
	dilate(src, erode_black2, struct2);

	imshow("w", erode_black1);
	imshow("q", erode_black2);

	waitKey(0);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值