// Watershedアルゴリズムによる画像の領域分割 // パラメータ: 分割数(横), 分割数(縦), マーカサイズ private OpenCvSharp.CPlusPlus.Mat procWatershed(OpenCvSharp.CPlusPlus.Mat matSrc, int wdiv, int hdiv, int msize) { // Matの準備 OpenCvSharp.CPlusPlus.Mat matDst = matSrc.Clone(); // IplImageの準備(C API用) OpenCvSharp.IplImage iplSrc = matSrc.ToIplImage(); OpenCvSharp.IplImage iplDst = iplSrc.Clone(); // マーカ画像の準備 OpenCvSharp.IplImage iplMarker = new OpenCvSharp.IplImage(iplSrc.Size, OpenCvSharp.BitDepth.S32, 1); iplMarker.Zero(); // マーカ設置(等分割) OpenCvSharp.CvPoint[,] mpt = new OpenCvSharp.CvPoint[wdiv, hdiv]; for (int i = 0; i < wdiv; i++) { for (int j = 0; j < hdiv; j++) { mpt[i, j] = new OpenCvSharp.CvPoint((int)(iplSrc.Width / wdiv * (i + 0.5)), (int)(iplSrc.Height / hdiv * (j + 0.5))); iplMarker.Circle(mpt[i, j], msize, OpenCvSharp.CvScalar.ScalarAll(i * wdiv + j), OpenCvSharp.Cv.FILLED, OpenCvSharp.LineType.Link8, 0); } } // 分割実行 OpenCvSharp.Cv.Watershed(iplSrc, iplMarker); // マーカの描画 for (int i = 0; i < wdiv; i++) { for (int j = 0; j < hdiv; j++) { iplDst.Circle(mpt[i, j], msize, OpenCvSharp.CvColor.White, 3, OpenCvSharp.LineType.Link8, 0); } } // 領域境界の描画 for (int i = 0; i < iplMarker.Height; i++) { for (int j = 0; j < iplMarker.Width; j++) { int idx = (int)(iplMarker.Get2D(i, j).Val0); if (idx == -1) { iplDst.Set2D(i, j, OpenCvSharp.CvColor.Red); } } } // IplImage -> Matに戻す matDst = new OpenCvSharp.CPlusPlus.Mat(iplDst); return matDst; }
// 画像ピラミッドを用いた画像の領域分割 // パラメータ: ピラミッドレベル, ピクセルを接続する閾値, クラスタリングの範囲の閾値 private OpenCvSharp.CPlusPlus.Mat procPyrSegmentation(OpenCvSharp.CPlusPlus.Mat matSrc, int level, double threshold1, double threshold2) { // Matの準備 OpenCvSharp.CPlusPlus.Mat matDst = matSrc.Clone(); // IplImageの準備(C API用) OpenCvSharp.IplImage iplSrc = matSrc.ToIplImage(); OpenCvSharp.IplImage iplDst = iplSrc.Clone(); // ピラミッド画像作成のためのROI設定(2^levelで割り切れるサイズ) OpenCvSharp.CvRect roi; roi.X = 0; roi.Y = 0; roi.Width = iplSrc.Width & -(1 << level); roi.Height = iplSrc.Height & -(1 << level); iplSrc.SetROI(roi); iplDst.SetROI(roi); OpenCvSharp.Cv.PyrSegmentation(iplSrc, iplDst, level, threshold1, threshold2); // IplImage -> Matに戻す matDst = new OpenCvSharp.CPlusPlus.Mat(iplDst); return matDst; }