Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

How to remove black background from grabcut output image in OpenCV android ?

image description

Hi, I am using OpenCV android library grabcut() method to extract an image from background, but the problem is that the output bitmap contains black background which I do not want please note that original image does not have any black background it is actually white and I am able to successfully extract the fish image from that but the output contains this kind of black background. I am attaching the code for your reference, I am new to opencv and don't have much understanding about it and grabcut algorithm also so kindly help me out.

public class Grabcut extends Activity { ImageView iv; Bitmap bitmap; Canvas canvas; Scalar color = new Scalar(255, 0, 0, 255); Point tl, br; int counter; Bitmap bitmapResult, bitmapBackground; Mat dst = new Mat(); final String pathToImage = Environment.getExternalStorageDirectory()+"/gcut.png"; public static final String TAG = "Grabcut demo"; static { if (!OpenCVLoader.initDebug()) { // Handle initialization error } } @Override public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
    setContentView(R.layout.grabcut_main);
    iv = (ImageView) this.findViewById(R.id.imageView);


    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.grabcut);
    Log.d(TAG, "bitmap: " + bitmap.getWidth() + "x" + bitmap.getHeight());


    bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
    Log.d(TAG, "bitmap 8888: " + bitmap.getWidth() + "x" + bitmap.getHeight());


    //GrabCut part
    Mat img = new Mat();
    Utils.bitmapToMat(bitmap, img);
    Log.d(TAG, "img: " + img);

    int r = img.rows();
    int c = img.cols();

    Point p1 = new Point(c/5, r/5);
    Point p2 = new Point(c-c/5, r-r/8);

    Rect rect = new Rect(p1,p2);
    //Rect rect = new Rect(50,30, 100,200);
    Log.d(TAG, "rect: " + rect);

    Mat mask = new Mat();
    debugger(""+mask.type());
    mask.setTo(new Scalar(125));
    Mat fgdModel = new Mat();
    fgdModel.setTo(new Scalar(255, 255, 255));
    Mat bgdModel = new Mat();
    bgdModel.setTo(new Scalar(255, 255, 255));

    Mat imgC3 = new Mat();  
    Imgproc.cvtColor(img, imgC3, Imgproc.COLOR_RGBA2RGB);
    Log.d(TAG, "imgC3: " + imgC3);

    Log.d(TAG, "Grabcut begins");
    Imgproc.grabCut(imgC3, mask, rect, bgdModel, fgdModel, 5, Imgproc.GC_INIT_WITH_RECT);

    Mat source = new Mat(1, 1, CvType.CV_8U, new Scalar(3.0));


    Core.compare(mask, source, mask, Core.CMP_EQ);
    Mat foreground = new Mat(img.size(), CvType.CV_8UC3, new Scalar(255, 255, 255));
    img.copyTo(foreground, mask);
    Core.rectangle(img, p1, p2, color);

    Mat background = new Mat();
    try {
        background = Utils.loadResource(getApplicationContext(),
                R.drawable.wall2 );
    } catch (IOException e) {

        e.printStackTrace();
    }
    Mat tmp = new Mat();
    Imgproc.resize(background, tmp, img.size());

    background = tmp;

    Mat tempMask = new Mat(foreground.size(), CvType.CV_8UC1, new Scalar(255, 255, 255));
    Imgproc.cvtColor(foreground, tempMask, 6/* COLOR_BGR2GRAY */);
    //Imgproc.threshold(tempMask, tempMask, 254, 255, 1 /* THRESH_BINARY_INV */);

    Mat vals = new Mat(1, 1, CvType.CV_8UC3, new Scalar(0.0));
    dst = new Mat();
    background.setTo(vals, tempMask);
    Imgproc.resize(foreground, tmp, mask.size());
    foreground = tmp;
    Core.add(background, foreground, dst, tempMask);

    //convert to Bitmap
    Log.d(TAG, "Convert to Bitmap");
    Utils.matToBitmap(dst, bitmap);

    iv.setBackgroundResource(R.drawable.wall2);
    iv.setImageBitmap(bitmap);
    //release MAT part
    img.release();
    imgC3.release();
    mask.release();
    fgdModel.release();
    bgdModel.release();

}

public void debugger(String s){
    Log.v("","########### "+s);
}

} I have attached here my output image it is showing half of the fish but that is not an issue, problem is the black background that is coming along with the fish image,I want the fish image to be directly be applied to the background grey wall image (R.drawable.wall2).Any help would be highly appreciated.

Thanks in anticipation, Dexter.

How to remove black background from grabcut output image in OpenCV android ?

image description

Hi, I am using OpenCV android library grabcut() method to extract an image from background, but the problem is that the output bitmap contains black background which I do not want please note that original image does not have any black background it is actually white and I am able to successfully extract the fish image from that but the output contains this kind of black background. I am attaching the code for your reference, I am new to opencv and don't have much understanding about it and grabcut algorithm also so kindly help me out.

public class Grabcut extends Activity {
    ImageView iv;
    Bitmap bitmap;
    Canvas canvas;
    Scalar color = new Scalar(255, 0, 0, 255);
    Point tl, br;
    int counter;
    Bitmap bitmapResult, bitmapBackground;
    Mat dst = new Mat();
    final String pathToImage  = Environment.getExternalStorageDirectory()+"/gcut.png";
    public static final String TAG = "Grabcut demo";
    static {
          if (!OpenCVLoader.initDebug()) {
            // Handle initialization error
          }
        }
    @Override
    public void onCreate(Bundle savedInstanceState) {

{

            super.onCreate(savedInstanceState);
     setContentView(R.layout.grabcut_main);
     iv = (ImageView) this.findViewById(R.id.imageView);


     Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.grabcut);
     Log.d(TAG, "bitmap: " + bitmap.getWidth() + "x" + bitmap.getHeight());


     bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
     Log.d(TAG, "bitmap 8888: " + bitmap.getWidth() + "x" + bitmap.getHeight());


     //GrabCut part
     Mat img = new Mat();
     Utils.bitmapToMat(bitmap, img);
     Log.d(TAG, "img: " + img);

     int r = img.rows();
     int c = img.cols();

     Point p1 = new Point(c/5, r/5);
     Point p2 = new Point(c-c/5, r-r/8);

     Rect rect = new Rect(p1,p2);
     //Rect rect = new Rect(50,30, 100,200);
     Log.d(TAG, "rect: " + rect);

     Mat mask = new Mat();
     debugger(""+mask.type());
     mask.setTo(new Scalar(125));
     Mat fgdModel = new Mat();
     fgdModel.setTo(new Scalar(255, 255, 255));
     Mat bgdModel = new Mat();
     bgdModel.setTo(new Scalar(255, 255, 255));

     Mat imgC3 = new Mat();  
     Imgproc.cvtColor(img, imgC3, Imgproc.COLOR_RGBA2RGB);
     Log.d(TAG, "imgC3: " + imgC3);

     Log.d(TAG, "Grabcut begins");
     Imgproc.grabCut(imgC3, mask, rect, bgdModel, fgdModel, 5, Imgproc.GC_INIT_WITH_RECT);

     Mat source = new Mat(1, 1, CvType.CV_8U, new Scalar(3.0));


     Core.compare(mask, source, mask, Core.CMP_EQ);
     Mat foreground = new Mat(img.size(), CvType.CV_8UC3, new Scalar(255, 255, 255));
     img.copyTo(foreground, mask);
     Core.rectangle(img, p1, p2, color);

     Mat background = new Mat();
     try {
         background = Utils.loadResource(getApplicationContext(),
                 R.drawable.wall2 );
     } catch (IOException e) {

         e.printStackTrace();
     }
     Mat tmp = new Mat();
     Imgproc.resize(background, tmp, img.size());

     background = tmp;

     Mat tempMask = new Mat(foreground.size(), CvType.CV_8UC1, new Scalar(255, 255, 255));
     Imgproc.cvtColor(foreground, tempMask, 6/* COLOR_BGR2GRAY */);
     //Imgproc.threshold(tempMask, tempMask, 254, 255, 1 /* THRESH_BINARY_INV */);

     Mat vals = new Mat(1, 1, CvType.CV_8UC3, new Scalar(0.0));
     dst = new Mat();
     background.setTo(vals, tempMask);
     Imgproc.resize(foreground, tmp, mask.size());
     foreground = tmp;
     Core.add(background, foreground, dst, tempMask);

     //convert to Bitmap
     Log.d(TAG, "Convert to Bitmap");
     Utils.matToBitmap(dst, bitmap);

     iv.setBackgroundResource(R.drawable.wall2);
     iv.setImageBitmap(bitmap);
     //release MAT part
     img.release();
     imgC3.release();
     mask.release();
     fgdModel.release();
     bgdModel.release();

 }

 public void debugger(String s){
     Log.v("","########### "+s);
    }
}

} I have attached here my output image it is showing half of the fish but that is not an issue, problem is the black background that is coming along with the fish image,I want the fish image to be directly be applied to the background grey wall image (R.drawable.wall2).Any help would be highly appreciated.

Thanks in anticipation, Dexter.

How to remove black background from grabcut output image in OpenCV android ?

image description

Hi, I am using OpenCV android library grabcut() method to extract an image from background, but the problem is that the output bitmap contains black background which I do not want please note that original image does not have any black background it is actually white and I am able to successfully extract the fish image from that but the output contains this kind of black background. I am attaching the code for your reference, I am new to opencv and don't have much understanding about it and grabcut algorithm also so kindly help me out.

public class Grabcut extends Activity {
    ImageView iv;
    Bitmap bitmap;
    Canvas canvas;
    Scalar color = new Scalar(255, 0, 0, 255);
    Point tl, br;
    int counter;
    Bitmap bitmapResult, bitmapBackground;
    Mat dst = new Mat();
    final String pathToImage  = Environment.getExternalStorageDirectory()+"/gcut.png";
    public static final String TAG = "Grabcut demo";
    static {
          if (!OpenCVLoader.initDebug()) {
            // Handle initialization error
          }
        }
    @Override
    public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
        setContentView(R.layout.grabcut_main);
        iv = (ImageView) this.findViewById(R.id.imageView);


        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.grabcut);
        Log.d(TAG, "bitmap: " + bitmap.getWidth() + "x" + bitmap.getHeight());


        bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
        Log.d(TAG, "bitmap 8888: " + bitmap.getWidth() + "x" + bitmap.getHeight());


        //GrabCut part
        Mat img = new Mat();
        Utils.bitmapToMat(bitmap, img);
        Log.d(TAG, "img: " + img);

        int r = img.rows();
        int c = img.cols();

        Point p1 = new Point(c/5, r/5);
        Point p2 = new Point(c-c/5, r-r/8);

        Rect rect = new Rect(p1,p2);
        //Rect rect = new Rect(50,30, 100,200);
        Log.d(TAG, "rect: " + rect);

        Mat mask = new Mat();
        debugger(""+mask.type());
        mask.setTo(new Scalar(125));
        Mat fgdModel = new Mat();
        fgdModel.setTo(new Scalar(255, 255, 255));
        Mat bgdModel = new Mat();
        bgdModel.setTo(new Scalar(255, 255, 255));

        Mat imgC3 = new Mat();  
        Imgproc.cvtColor(img, imgC3, Imgproc.COLOR_RGBA2RGB);
        Log.d(TAG, "imgC3: " + imgC3);

        Log.d(TAG, "Grabcut begins");
        Imgproc.grabCut(imgC3, mask, rect, bgdModel, fgdModel, 5, Imgproc.GC_INIT_WITH_RECT);

        Mat source = new Mat(1, 1, CvType.CV_8U, new Scalar(3.0));


        Core.compare(mask, source, mask, Core.CMP_EQ);
        Mat foreground = new Mat(img.size(), CvType.CV_8UC3, new Scalar(255, 255, 255));
        img.copyTo(foreground, mask);
        Core.rectangle(img, p1, p2, color);

        Mat background = new Mat();
        try {
            background = Utils.loadResource(getApplicationContext(),
                    R.drawable.wall2 );
        } catch (IOException e) {

            e.printStackTrace();
        }
        Mat tmp = new Mat();
        Imgproc.resize(background, tmp, img.size());

        background = tmp;

        Mat tempMask = new Mat(foreground.size(), CvType.CV_8UC1, new Scalar(255, 255, 255));
        Imgproc.cvtColor(foreground, tempMask, 6/* COLOR_BGR2GRAY */);
        //Imgproc.threshold(tempMask, tempMask, 254, 255, 1 /* THRESH_BINARY_INV */);

        Mat vals = new Mat(1, 1, CvType.CV_8UC3, new Scalar(0.0));
        dst = new Mat();
        background.setTo(vals, tempMask);
        Imgproc.resize(foreground, tmp, mask.size());
        foreground = tmp;
        Core.add(background, foreground, dst, tempMask);

        //convert to Bitmap
        Log.d(TAG, "Convert to Bitmap");
        Utils.matToBitmap(dst, bitmap);

        iv.setBackgroundResource(R.drawable.wall2);
        iv.setImageBitmap(bitmap);
        //release MAT part
        img.release();
        imgC3.release();
        mask.release();
        fgdModel.release();
        bgdModel.release();

    }

    public void debugger(String s){
        Log.v("","########### "+s);
    }
}

I have attached here my output image it is showing half of the fish but that is not an issue, problem is the black background that is coming along with the fish image,I want the fish image to be directly be applied to the background grey wall image (R.drawable.wall2).Any help would be highly appreciated.

Thanks in anticipation, Dexter.