day23:矩的计算

本文介绍了图像处理中的矩计算方法,包括几何矩、中心矩和Hu矩。通过OpenCV库实现图像边缘检测、轮廓提取,并计算矩特征。Hu矩因其旋转、平移和缩放不变性,被用于图像轮廓的匹配。通过比较不同图像的Hu矩,实现了轮廓的匹配,展示了矩在图像识别中的应用。
摘要由CSDN通过智能技术生成
矩是描述图像特征的算子,广泛应用于图像检索和识剔,图像匹配 ,图 像重建,图像压 缩,以
运动图像序列分析等领域。
1:几何矩和中心距:
计算图像矩的moment()函数:
void visionagin::Mymoment()
{
	Mat src = imread("C:\\Users\\86176\\Downloads\\visionimage\\contour.jfif");
	imshow("原图", src);
	Mat canny;
	Canny(src, canny, 50, 150);
	imshow("边缘", canny);
	//Mat core = getStructuringElement(0, Size(3, 3));//结构元素
	//morphologyEx(canny, canny, MORPH_OPEN, core);
	//imshow("dilate", canny);
	vector<vector<Point>> contours;
	findContours(canny, contours, RETR_TREE, CHAIN_APPROX_SIMPLE);//轮廓检测
	for (int i = 0; i < contours.size(); ++i)
	{
		Moments M;
		M=moments(contours[i], true);
		cout << "几何矩";
		cout << "m00: " << M.m00 <<  "m01: " << M.m01 <<  "m10: " << M.m10 << endl;
		cout << "m02: " << M.m02 <<  "m11: " << M.m11 << "m20: " << M.m20 << endl;
		cout << "m03: " << M.m03 << "m21: " << M.m21 << "m12: " << M.m12 << endl << "m30: " << M.m30 << endl;

		cout << "中心矩";
		cout << "mu02: " << M.mu02 << "mu11: " << M.mu11 << "mu20: " << M.mu20 << endl;
		cout << "mu03: " << M.mu03 << "mu21: " << M.mu21 << "mu12: " << M.mu12 << "mu30: " << M.mu30 << endl;

		cout << "中心归一矩";
		cout << "nu02: " << M.nu02 << "nu11: " << M.nu11 << "nu20: " << M.nu20 << endl;
		cout << "nu03: " << M.nu03 << "nu21: " << M.nu21 << "nu12: " << M.nu12 << "nu30: " << M.nu30 << endl;
	}
}

2:Hu距:

Hu 矩具有旋转、平移和缩放不变性,因此,在图像具有旋转和缩放的情况下, Hu 矩具有更广
泛的应用. Hu 矩是由二阶和三阶中心矩计算得到7 个不变矩。
实现:
void visionagin:: MyHumoment()
{
	Mat src = imread("C:\\Users\\86176\\Downloads\\visionimage\\contour.jfif");
	imshow("原图", src);
	Mat canny;
	Canny(src, canny, 50, 150);
	imshow("边缘", canny);
	vector<vector<Point>> contours;
	findContours(canny, contours, RETR_TREE, CHAIN_APPROX_SIMPLE);//轮廓检测
	for (int i = 0; i < contours.size(); ++i)
	{
		Moments M;
		M=moments(contours[i],true);
		Mat hu;
		HuMoments(M, hu);
		cout << hu << endl;
	}
}

 3:基于Hu矩的轮廓匹配

由于 Hu 矩具有旋转、平移和缩放不变性,因此可以通过 Hu 实现图像轮廓的匹配。

 实现:

void visionagin:: MyHumomentsmatch()
{
	Mat img1 = imread("C:\\Users\\86176\\Downloads\\visionimage\\abc.jpg");
	Mat img2 = imread("C:\\Users\\86176\\Downloads\\visionimage\\a.jpg");
	vector<vector<Point>> contours1, contours2;
	Mat canny1,canny2;
	Canny(img1, canny1, 20, 40);
	Canny(img2, canny2, 20, 40);
	findContours(canny1, contours1, RETR_TREE, CHAIN_APPROX_SIMPLE);//轮廓检测
	findContours(canny2, contours2, RETR_TREE, CHAIN_APPROX_SIMPLE);//轮廓检测
	Moments M2;
	M2 = moments(contours2[0], true);
	Mat hu2;
	HuMoments(M2, hu2);//计算模板Hu矩
	for (int i = 0; i < contours1.size(); ++i)
	{
		Moments M1;
		M1 = moments(contours1[i], true);
		Mat hu1;
		HuMoments(M1, hu1);
		double dist = matchShapes(hu1, hu2, CONTOURS_MATCH_I1, 0);
		if (dist < 1)
		{
			drawContours(img1, contours1, i, Scalar(0, 0,255));
		}
	}
	namedWindow("模板", WINDOW_NORMAL);
	namedWindow("out", WINDOW_NORMAL);
	imshow("out", img1);
	imshow("模板", img2);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值