0

我正在使用 OpenCV android 库阈值方法进行图像分割,但问题是输出位图包含我不想要的黑色背景,请注意原始图像没有任何黑色背景,它实际上是白色的。我附上代码供您参考,我是opencv的新手,对它不太了解,所以请帮助我。

private void Segmentation() {
    Mat srcMat = new Mat();
    gray = new Mat();

    Utils.bitmapToMat(imageBmp, srcMat);
    Imgproc.cvtColor(srcMat, gray, Imgproc.COLOR_RGBA2GRAY);
    grayBmp = Bitmap.createBitmap(imageBmp.getWidth(), imageBmp.getHeight(), Bitmap.Config.RGB_565);
    Utils.matToBitmap(gray, grayBmp);

    grayscaleHistogram();

    Mat threshold = new Mat();
    Imgproc.threshold(gray, threshold, 0, 255, Imgproc.THRESH_BINARY_INV + Imgproc.THRESH_OTSU);
    thresBmp = Bitmap.createBitmap(imageBmp.getWidth(), imageBmp.getHeight(), Bitmap.Config.RGB_565);
    Utils.matToBitmap(threshold, thresBmp);

    Mat closing = new Mat();
    Mat kernel = Mat.ones(5, 5, CvType.CV_8U);
    Imgproc.morphologyEx(threshold, closing, Imgproc.MORPH_CLOSE, kernel, new Point(-1, -1), 3);
    closingBmp = Bitmap.createBitmap(imageBmp.getWidth(), imageBmp.getHeight(), Bitmap.Config.RGB_565);
    Utils.matToBitmap(closing, closingBmp);

    result = new Mat();
    Core.subtract(closing, gray, result);
    Core.subtract(closing, result, result);


    resultBmp = Bitmap.createBitmap(imageBmp.getWidth(), imageBmp.getHeight(), Bitmap.Config.RGB_565);
    Utils.matToBitmap(result, resultBmp);

    Glide.with(ResultActivity.this).asBitmap().load(resultBmp).into(ivAfter);
}

在此处输入图像描述

4

1 回答 1

0

那你到底想要什么?二进制阈值的工作方式如下:

if value < threshold:
  value = 0
else:
  value = 1

当然,您可以将其转换为灰度/RGB 图像并根据自己的喜好调整背景。您还可以使用 ~ 运算符反转图像(白色背景、黑色分割)。

segmented_image = ~ segmented_image

编辑:OpenCV 有一个专用标志来反转结果:CV_THRESH_BINARY_INV您已经在使用它,也许尝试将其更改为CV_THRESH_BINARY

于 2019-11-21T12:30:23.647 回答