Opencv Android: как удалить черный фон из порогового вывода?

Я использую метод порогового значения библиотеки Android OpenCV для сегментации изображения, но проблема в том, что выходное растровое изображение содержит черный фон, который мне не нужен. Обратите внимание, что исходное изображение не имеет черного фона, оно на самом деле белое. Я прикрепляю код для вашей справки, я новичок в 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);
}

введите здесь описание изображения


person Mochamad Fandi    schedule 18.11.2019    source источник
comment
Что вы подразумеваете под удалением фона blzck? Вы хотите, чтобы ваши фоновые пиксели были белыми, а не черными?   -  person vSomers    schedule 11.12.2019


Ответы (1)


Что именно вы хотите, чтобы это было тогда? Двоичный порог работает следующим образом:

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

Конечно, вы можете преобразовать его в изображение в оттенках серого / RGB и настроить фон по своему вкусу. Вы также можете инвертировать изображение (белый фон, черная сегментация) с помощью оператора ~.

segmented_image = ~ segmented_image

Изменить: OpenCV имеет специальный флаг для инвертирования результатов: CV_THRESH_BINARY_INV Вы уже используете его, возможно, попробуйте изменить его на CV_THRESH_BINARY

person code-lukas    schedule 21.11.2019