无法从原始图像裁剪蒙版

Unable to crop mask from original image

我正在尝试从图像中删除背景。为此,我正在使用 TensorFlow,它为我提供了一个对象的掩码。之后,我从图像中裁剪蒙版,但结果不如我想要的好。

使用 TensorFlow 进行 掩码 https://github.com/tensorflow/examples/tree/master/lite/examples/image_segmentation/android https://www.tensorflow.org/lite/examples/segmentation/overview

从图像中裁剪 遮罩。

 fun bitmapDstIn(mask: Bitmap?, original: Bitmap?): Bitmap? {
        return try {
            val result =
                original?.let { Bitmap.createBitmap(it.width, it.height, Bitmap.Config.ARGB_8888) }
            val mCanvas = result?.let { Canvas(it) }
            val paint = Paint(Paint.ANTI_ALIAS_FLAG)
            paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
            mask?.let { mCanvas?.drawBitmap(it, 0f, 0f, null) }
            original?.let { mCanvas?.drawBitmap(it, 0f, 0f, paint) }
            paint.xfermode = null
            result
        } catch (e: Exception) {
            println(e.message.toString())
            original
        }
    }

从原始位图中裁剪蒙版后。我是 SRC_OVER 结果位图两次,隐藏了 透明度 问题。

fun creatingMasking(original: Bitmap?, mask: Bitmap?): Bitmap? {
            return try {
                var result: Bitmap? =
                    mask?.let { original?.let { it1 -> croppingMaskFromOriginal(it, it1) } }
                val final = result
                result = result?.let { overlay(it, it) }
                result = result?.let { final?.let { it1 -> overlay(it, it1) } }
                result
            } catch (e: Exception) {
                original
            } catch (e: OutOfMemoryError) {
                original
            }
        }


        private fun croppingMaskFromOriginal(base: Bitmap, blend1: Bitmap): Bitmap {
            return try {
                val result: Bitmap =
                    base.copy(Bitmap.Config.ARGB_8888, true)
                val blend = Bitmap.createScaledBitmap(blend1, base.width, base.height, false)
                val p = Paint()
                p.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
                p.shader = BitmapShader(blend, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR)
                p.alpha = 255
                val c = Canvas()
                c.setBitmap(result)
                c.drawBitmap(base, 0f, 0f, null)
                c.drawRect(0f, 0f, base.width.toFloat(), base.height.toFloat(), p)
                result
            } catch (e: Exception) {
                base
            } catch (e: OutOfMemoryError) {
                base
            }
        }

        private fun overlay(base: Bitmap, blend1: Bitmap): Bitmap {
            return try {
                val result: Bitmap =
                    base.copy(Bitmap.Config.ARGB_8888, true)
                val blend = Bitmap.createScaledBitmap(blend1, base.width, base.height, false)
                val p = Paint()
                p.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)
                p.shader = BitmapShader(blend, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR)
                val c = Canvas()
                c.setBitmap(result)
                c.drawBitmap(base, 0f, 0f, null)
                c.drawRect(0f, 0f, base.width.toFloat(), base.height.toFloat(), p)
                result
            } catch (e: Exception) {

                base
            } catch (e: OutOfMemoryError) {
                base
            }
        }