矩是描述图像特征的算子,广泛应用于图像检索和识剔,图像匹配
,图
像重建,图像压
缩,以
运动图像序列分析等领域。
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);
}