如何在Android中使用Opencv分水岭算法获得更好的结果?

时间:2019-05-16 02:46:18

标签: android image-processing image-segmentation opencv4android watershed

我有一个由3个对象组成的图像,我需要提取这些对象。我尝试了Watershed算法,但无法正常工作。

我对这种算法的工作方式没有很好的了解,所以我无法弄清真正的问题。

这是我的代码

public Mat steptowatershed(Mat img)
    {
        Mat threeChannel = new Mat();

        Imgproc.cvtColor(img, threeChannel, Imgproc.COLOR_BGR2GRAY);
        Imgproc.threshold(threeChannel, threeChannel, 0, 255, Imgproc.THRESH_BINARY_INV + Imgproc.THRESH_OTSU);



        Mat fg = new Mat(img.size(),CvType.CV_8U);
        Imgproc.erode(threeChannel,fg,new Mat());

        Mat bg = new Mat(img.size(),CvType.CV_8U);
        Imgproc.dilate(threeChannel,bg,new Mat());
        Imgproc.threshold(bg,bg,1, 128,Imgproc.THRESH_BINARY_INV);

        Mat markers = new Mat(img.size(),CvType.CV_8U, new Scalar(0));
        Core.add(fg, bg, markers);
        Mat result1= new Mat();
        Imgproc.cvtColor(img, img, Imgproc.COLOR_BGRA2BGR);
        WatershedSegmenter segmenter = new WatershedSegmenter();
        segmenter.setMarkers(markers);
        result1 = segmenter.process(img);
        return result1;
    }

    public class WatershedSegmenter
    {
        public Mat markers=new Mat();

        public void setMarkers(Mat markerImage)
        {

            markerImage.convertTo(markers, CvType.CV_32SC1);
        }

        public Mat process(Mat image)
        {
            Imgproc.watershed(image,markers);
            markers.convertTo(markers,CvType.CV_8U);
            return markers;
        }
    }

这是原始图片

enter image description here

这是结果图像 enter image description here

我以后需要提取所有3个对象。

希望大家帮我解决这个问题。

0 个答案:

没有答案