2014-02-17 74 views
1

我正在使用OpenCV的分水嶺算法編寫一個樣本。我能夠創建蒙版圖像,但是蒙版具有白色背景而不是透明背景。是否有辦法去除這個白色背景並使其透明?我使用的代碼被提供如下:從流域掩模中刪除白色背景圖像

Mat threeChannel = new Mat(); 

Imgproc.cvtColor(croppedImageMat, threeChannel, Imgproc.COLOR_BGR2GRAY); 
Imgproc.threshold(threeChannel, threeChannel, 100, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU); 

Mat fg = new Mat(croppedImageMat.size(), CvType.CV_8U); 
Imgproc.erode(threeChannel, fg, new Mat(), new Point(-1, -1), 12); 

Mat bg = new Mat(croppedImageMat.size(), CvType.CV_8U); 
Imgproc.dilate(threeChannel, bg, new Mat(), new Point(-1, -1), 12); 
Imgproc.threshold(bg, bg, 1, 128, Imgproc.THRESH_BINARY_INV); 

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

WatershedSegmenter segmenter = new WatershedSegmenter(); 
segmenter.setMarkers(markers); 
Mat result = segmenter.process(croppedImageMat); 
Bitmap resultBmp = Bitmap.createBitmap(result.cols(), result.rows(), Bitmap.Config.ARGB_8888); 
Utils.matToBitmap(result, resultBmp); 
Constants.writeBitmapToFile(resultBmp); 

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

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

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

我打算由源圖像和掩模繪製到屏幕外的畫布創建使用Android的PorterDuff模式的圖像。請讓我知道如果我在這裏做錯了什麼。

回答

1

您可以使用二進制掩碼來獲得透明效果。

只需使用此掩碼將片段複製到背景即可。

查看方法A.copyTo(B,mask);

如果你想獲得半透明,您可以使用公式

R=fg.mul(mask)+bg.mul(1.0-mask); 

其中

  • 的R - 結果矩陣(CV_32FC1)
  • FG - 前景圖像(CV_32FC1)
  • bg - 背景圖像(CV_32FC1),
  • mask - 透明圖層(CV_32FC1)值範圍應爲[0。 0; 1.0]

如果您想使用3通道圖像,請使用cv :: split metod,然後按照上面的說明處理每個通道,然後使用cv :: merge方法處理組合通道。