F120#_Emgucv例程-图像的矩

图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(数据描述量)来描述整个图像,这组数据越简单越有代表性越好。良好的特征不受光线、噪点、几何形变的干扰,图像识别技术的发展中,不断有新的描述图像特征提出,而图像不变矩就是其中一个。

从图像中计算出来的矩通常描述了图像不同种类的几何特征如:大小、灰度、方向、形状等,图像矩广泛应用于模式识别、目标分类、目标识别与防伪估计、图像编码与重构等领域。【更多关于图像的矩的知识请加入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();

实现效果如下:

F120#_Emgucv例程-图像的矩

【更过关于图像的矩例程的朋友请加QQ群609905705】。