在图像处理中,矩是用来描述图像形状的一种数学工具,它可以用于计算图像的质心、面积、中心矩等特征。
对于二值图像,一个像素可能是0或1,将图像看作一个灰度函数f(x,y),可定义第阶矩Mu(p,q):
- x,y分别是图像中的像素坐标;
- p,q是非负整数;
常见的矩:
- :图像面积;
- :所有像素的 x 坐标之和;
- :所有像素的 y 坐标之和;
- :所有像素的 x 坐标的平方之和;
- :所有像素的 y 坐标的平方之和;
- :所有像素的 x 坐标和 y 坐标的积之和;
从这些矩可以进一步计算出图像的中心位置和方向:
- 图像的质心位置:
- 图像的主轴方向与x轴之间的夹角θ:
计算图像矩API:
Moments moments (InputArray array,
bool binaryImage = false
)
参数解析:
//InputArray array:输入图像(单通道8-bit类型的图像)或点集(1xN或Nx1维,类型为Point或Pointf);
//bool binaryImage = false :输入是否为二值图像(该参数仅用于图像),如果为ture,所有非0像素都被视为1;
代码演示:
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc,char**argv)
{
Mat src = imread("C:/picture/source.jpg");
Mat grayImg;
cvtColor(src, grayImg, CV_BGR2GRAY);
Moments grayImgM = moments(grayImg, false);
Point center;
center.x = grayImgM.m10 / grayImgM.m00;
center.y = grayImgM.m01 / grayImgM.m00;
circle(src, center, 5, Scalar(0, 0, 255), -1);
imshow("src", src);
Canny(grayImg, grayImg,35,70,3);
imshow("Laplacian", grayImg);
vector<vector<Point>>contours;
findContours(grayImg,contours,RETR_EXTERNAL,CHAIN_APPROX_NONE);
vector<Point>centers(contours.size());
vector<Moments>contoursM(contours.size());
cout << contours.size() << endl;
for (size_t i = 0; i < contours.size(); i++)
{
contoursM[i] = moments(contours[i], false);
centers[i].x = contoursM[i].m10 / contoursM[i].m00;
centers[i].y = contoursM[i].m01 / contoursM[i].m00;
//cout << i<<" : " << centers[i] << endl;
circle(src, centers[i], 1, Scalar(0,0,0), -1);
}
imshow("grayImg", src);
waitKey();
return 0;
}