android - 从分水岭蒙版中删除白色背景图像

标签 android opencv

我正在使用 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 模式创建一个图像,方法是将源图像和蒙版绘制到离屏 Canvas 上。如果我在这里做错了什么,请告诉我。

最佳答案

您可以使用二进制 mask 来获得透明效果。

只需使用此掩码将您的 fragment 复制到背景即可。

参见方法 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 channel 图像,请使用 cv::split 方法,然后在使用 cv::merge 方法处理合并 channel 后,按上述方法处理每个 channel 。

关于android - 从分水岭蒙版中删除白色背景图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21837924/

相关文章:

visual-studio-2008 - OpenCV 库文件夹在哪里?

visual-studio - OpenCV Build on Visual Studio LINK 错误

java - 如何更新不可见/离屏 View ?

java - 只需触摸屏幕即可启动新 Activity

java - Android Volley Request转iOS NSURL异步请求

android - 由于包含使用不受支持的插件版本的 Kotlin 模块,因此不支持新的 Gradle Sync

java - Opencv - 构建 Opencv 失败 (MacOSX)

java - 通过蓝牙在 JavaFX 和 Android 之间传输图像

android - 在 Android 上使用 OpenCV 预处理图像以优化 ocr 准确性

c++ - 如何使用 cmake 将两个库链接到我的程序?