分割的目的是为了从图像中提取出感兴趣区域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