Как убрать фон интересующего изображения с помощью opencv на android? - PullRequest
5 голосов
/ 01 апреля 2020

Я работаю с opencv для android studio. У меня мало опыта с этим, поэтому я прошу помощи, чтобы удалить фон с изображения и оставить только область интереса. Я работаю с изображениями ран и хочу оставить только область раны на экране приложения, как показано на рисунке ниже.

enter image description here

Я работаю с kotlin, и мне удалось выполнить водораздел изображения, просто пропуская область раны на фоне изображения, может ли кто-нибудь мне помочь?

private fun threashold(){

    val width = imgBmpDefault?.getWidth()!!
    val height = imgBmpDefault?.getHeight()!!
    val rgba = Mat()
    val gray_mat = Mat()
    val threeChannel = Mat()
    Utils.bitmapToMat(imgBmpDefault, gray_mat)
    Imgproc.cvtColor(gray_mat, rgba, Imgproc.COLOR_RGBA2RGB)
    Imgproc.cvtColor(rgba, threeChannel, Imgproc.COLOR_RGB2GRAY)
    Imgproc.threshold(threeChannel, threeChannel, 100.0, 255.0, Imgproc.THRESH_OTSU)
    val fg = Mat(rgba.size(), CvType.CV_8U)
    Imgproc.erode(threeChannel, fg, Mat(), Point(-1.0, -1.0), 2)
    val bg = Mat(rgba.size(), CvType.CV_8U)
    Imgproc.dilate(threeChannel, bg, Mat(), Point(-1.0, -1.0), 3)
    Imgproc.threshold(bg, bg, 1.0, 128.0, Imgproc.THRESH_BINARY_INV)
    val markers = Mat(rgba.size(), CvType.CV_8U, Scalar(0.0))
    Core.add(fg, bg, markers)

    val marker_tempo = Mat()
    markers.convertTo(marker_tempo, CvType.CV_32S)

    Imgproc.watershed(rgba, marker_tempo)
    marker_tempo.convertTo(markers, CvType.CV_8U)

    imgBmpExit = Bitmap.createBitmap(width, height, Config.RGB_565)

    Imgproc.applyColorMap(markers, markers, 4)
    Utils.matToBitmap(markers, imgBmpExit)

    imagem.setImageBitmap(imgBmpExit)

}

Выход с использованием других изображение раны:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...