图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(数据描述量)来描述整个图像,这组数据越简单越有代表性越好。良好的特征不受光线、噪点、几何形变的干扰,图像识别技术的发展中,不断有新的描述图像特征提出,而图像不变矩就是其中一个。
从图像中计算出来的矩通常描述了图像不同种类的几何特征如:大小、灰度、方向、形状等,图像矩广泛应用于模式识别、目标分类、目标识别与防伪估计、图像编码与重构等领域。【更多关于图像的矩的知识请加入QQ:609905705】
下面分享代码:
//读取源图
Mat srcMat = CvInvoke.Imread("example.jpg", ImreadModes.Color);
//定义变量
Mat grayMat = new Mat();//灰度图
Mat cannyMat = new Mat();//Canny图
int thresh = 100;//阈值
//将源图转为灰度图并进行平滑
CvInvoke.CvtColor(srcMat, grayMat, ColorConversion.Bgr2Gray);
CvInvoke.Blur(grayMat, grayMat, new Size(3, 3), new Point(-1, -1));
//使用Canny算子进行边缘检测
CvInvoke.Canny(grayMat, cannyMat, thresh, thresh * 2, 3);
//找到轮廓
VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
CvInvoke.FindContours(cannyMat, contours, null, RetrType.Tree, ChainApproxMethod.ChainApproxSimple);
//计算矩
List<Moments> mu = new List<Moments>(contours.Size);
for(int i=0;i<contours.Size;i++)
{
CvInvoke.Moments(contours[4], false);
}
//计算中心矩
PointF[] mc = new PointF[contours.Size];
for (int i = 0; i < contours.Size; i++)
{
mc[i] = new PointF((float)(mu[i].M10 / mu[i].M00), (float)(mu[i].M01 / mu[i].M00));
}
//绘制轮廓
Mat drawMat = new Mat(cannyMat.Size, DepthType.Cv8U, 3);
for (int i = 0; i < contours.Size; i++)
{
CvInvoke.DrawContours(drawMat, contours, i, new MCvScalar(0, 255, 0), 2);
}
//分别显示源和目标图
CvInvoke.Imshow("srcMat", srcMat);
CvInvoke.Imshow("drawMat", drawMat);
CvInvoke.WaitKey();
实现效果如下:
【更过关于图像的矩例程的朋友请加QQ群609905705】。