美文网首页
C#:切割图像的改进

C#:切割图像的改进

作者: 大龙10 | 来源:发表于2023-06-15 11:31 被阅读0次
切割图像的改进

一、改进办法

  使用FindContours函数识别圆后生产的识别序号与实际排列顺序不同,在处理时进行改进,另外生成一个数组ds0存放实际排列顺序的序列。

   CircleSegment0[] cs0 = new CircleSegment0[10];
   CircleSegment0[] ds0 = new CircleSegment0[10];

二、识别时转存数组

        private void uiButton2_Click(object sender, EventArgs e)
        {
            {
                //1:因为霍夫圆检测对噪声比较敏感,所以首先对图像做一个中值滤波或高斯滤波(噪声如果没有可以不做)
                Mat m1 = new Mat();
                Cv2.MedianBlur(src_img, m1, 3); //  ksize必须大于1且是奇数

                //2:转为灰度图像
                Mat m2 = new Mat();
                Cv2.CvtColor(m1, m2, ColorConversionCodes.BGR2GRAY);

                //3:霍夫圆检测:使用霍夫变换查找灰度图像中的圆。
                /*
                 * 参数:
                 *      1:输入参数: 8位、单通道、灰度输入图像
                 *      2:实现方法:目前,唯一的实现方法是HoughCirclesMethod.Gradient
                 *      3: dp      :累加器分辨率与图像分辨率的反比。默认=1
                 *      4:minDist: 检测到的圆的中心之间的最小距离。(最短距离-可以分辨是两个圆的,否则认为是同心圆-                            src_gray.rows/8)
                 *      5:param1:   第一个方法特定的参数。[默认值是100] canny边缘检测阈值低
                 *      6:param2:   第二个方法特定于参数。[默认值是100] 中心点累加器阈值 – 候选圆心
                 *      7:minRadius: 最小半径
                 *      8:maxRadius: 最大半径
                 * 
                 */
                CircleSegment[] cs = Cv2.HoughCircles(m2, HoughMethods.Gradient, 1, 80, 60, 20, 60, 200);
                src_img.CopyTo(dst);
                // Vec3d vec = new Vec3d();
                for (int i = 0; i < cs.Count(); i++)
                {
                    //画圆
                    Cv2.Circle(dst, (int)cs[i].Center.X, (int)cs[i].Center.Y, (int)cs[i].Radius, new Scalar(0, 0, 255), 5, LineTypes.AntiAlias);
                    //加强圆心显示
                    Cv2.Circle(dst, (int)cs[i].Center.X, (int)cs[i].Center.Y, 3, new Scalar(0, 0, 255), 3, LineTypes.AntiAlias);

                    cs0[i].Center = cs[i].Center;
                    cs0[i].Radius = cs[i].Radius;

                    int x0 = (int)cs[i].Center.X;
                    int y0 = (int)cs[i].Center.Y;
                    //显示圆心坐标
                    Cv2.PutText(dst, i.ToString()+"(" + x0.ToString() + "," + y0.ToString() + ")", new OpenCvSharp.Point(x0-100, y0 + 200), 0, 1.25, new OpenCvSharp.Scalar(0, 0, 255), 2);
                    // 根据X的坐标值,计算实际排列顺序
                    int j = (x0 - 190) / 300;
                    ds0[j] = cs0[i];

                }
                picBoxShowDel.Image = dst.ToBitmap();
            }
        }

三、展示分割的6个图形

        private void uiButton4_Click(object sender, EventArgs e)
        {
           for (int i = 0; i < 6; i++)
            {
                int k0 = i;
                int x0 = (int)ds0[k0].Center.X;
                int y0 = (int)ds0[k0].Center.Y;
                int r0 = (int)ds0[k0].Radius;
                OpenCvSharp.Rect roi = new OpenCvSharp.Rect(x0 - r0 - 50, y0 - r0 - 50, 2 * (r0 + 50), 2 * (r0 + 50));
                Mat ImageROI = new Mat(src_img, roi);//新建一个mat,把roi内的图像加载到里面去
                switch (i)
                {
                    case 0:
                        pictureBox2.Image = ImageROI.ToBitmap();
                        break;
                    case 1:
                        pictureBox3.Image = ImageROI.ToBitmap();
                        break;
                    case 2:
                        pictureBox4.Image = ImageROI.ToBitmap();
                        break;
                    case 3:
                        pictureBox5.Image = ImageROI.ToBitmap();
                        break;
                    case 4:
                        pictureBox6.Image = ImageROI.ToBitmap();
                        break;
                    case 5:
                        pictureBox7.Image = ImageROI.ToBitmap();
                        break;
                }
            }
        }

相关文章

网友评论

      本文标题:C#:切割图像的改进

      本文链接:https://www.haomeiwen.com/subject/vdfkydtx.html