OpenCVSharp4 识别物体系列之分割

分割的目的是为了从图像中提取出感兴趣区域ROI(region of interest)。

  • 连通组件算法
    一种常见算法,用于分割和识别二进制图像中的特定部分。
            Mat src = Cv2.ImRead("origin.png", ImreadModes.Grayscale);
            using Window WinSrc = new Window("src", src);

            Mat binary = src.Threshold(0, 255, ThresholdTypes.BinaryInv | ThresholdTypes.Otsu);
            using Window winBinary = new Window("binary", binary);

            ConnectedComponents cc = Cv2.ConnectedComponentsEx(binary, PixelConnectivity.Connectivity4);
            if (cc.LabelCount <= 1)
            {
                Console.WriteLine("no objects detected");
                Console.ReadKey();
                return;
            }

            Mat labelView = src.EmptyClone();
            cc.RenderBlobs(labelView);
            using Window winLabel = new Window("labelView", labelView);

            Mat rectView = binary.CvtColor(ColorConversionCodes.GRAY2BGR);
            foreach (var blob in cc.Blobs.Skip(1))
            {
                Cv2.PutText(rectView, $"{blob.Area}", new Point(blob.Centroid.X, blob.Centroid.Y), HersheyFonts.HersheyComplex, 1, new Scalar(255, 0, 0), 2);
                rectView.Rectangle(blob.Rect, Scalar.Red);
            }
            using Window windowBound = new Window("bonding boxes", rectView);

            var maxBlob = cc.GetLargestBlob();
            var filtered = new Mat();
            cc.FilterByBlob(src, filtered, maxBlob);
            using Window windowMax = new Window("maximum blob", filtered);

            Cv2.WaitKey();
src.jpg

binary.jpg

label.jpg

rect.jpg

max block.jpg
  • 轮廓
            Mat src = Cv2.ImRead("origin.png", ImreadModes.Grayscale);
            using Window winSrc = new Window("src", src);

            Mat binary = src.Threshold(0, 255, ThresholdTypes.BinaryInv | ThresholdTypes.Otsu);
            using Window winBinary = new Window("binary", binary);

            binary.FindContours(out Point[][] contoursPoints, out HierarchyIndex[] hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxSimple);
            Mat color = src.CvtColor(ColorConversionCodes.GRAY2BGR);
            color.DrawContours(contoursPoints, -1, new Scalar(255, 255, 0), 2);
            using Window winContours = new Window("contours", color);

            Cv2.WaitKey();
contours.jpg
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。