0

I am trying to locate centers of pits in this image.

enter image description here

I used watershed algorithm which I thought is used for finding pits on the image but the result image gives nothing useful for me. Am I used this algorithm properly? Should I do it in another way? Here is my code:

public static void main (String args[]){

        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat image = new Mat();
        image=Imgcodecs.imread("cellar.jpg");

        if ( image == null) System.out.println("not working");
        else System.out.println("ok");

        Mat binaryImage = new Mat();
        Imgproc.cvtColor(image, binaryImage, Imgproc.COLOR_BGR2GRAY);
        Imgproc.threshold(binaryImage,binaryImage,0,255,Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU);

        Mat fg = new Mat(image.size(),CvType.CV_8U);
        Imgproc.erode(binaryImage,fg,new Mat(),new Point(-1,-1),2);

         Mat bg = new Mat(image.size(),CvType.CV_8U);
         Imgproc.dilate(binaryImage,bg,new Mat(),new Point(-1,-1),3);
         Imgproc.threshold(bg,bg,1, 128,Imgproc.THRESH_BINARY_INV);

         Mat markers = new Mat(image.size(),CvType.CV_8U, new Scalar(0));
         Core.add(fg, bg, markers);

         if(markers==null) System.out.println("ojojoj");
         else System.out.println("perfect");

         WatershedSegmenter segmenter = new WatershedSegmenter();
         segmenter.setMarkers(markers);
         Mat result = segmenter.process(image);

         Imgcodecs.imwrite("resultMat.png", result);
}        


public class WatershedSegmenter{
    public Mat markers;

    public void setMarkers(Mat markerImage)
    {
        markers = new Mat();
        markerImage.convertTo(markers, CvType.CV_32S);
    }

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

Here is result image: enter image description here

Thanks for any help :)

Fleczer
  • 63
  • 10

0 Answers0