0

在 opencv (java) 中是否有等效的 'smoothstep' 函数?它通常用于 opengl/glsl 并且在许多其他标准图像处理库中作为标准内置函数提供。也许我们可以使用组合来实现它阈值/钳位功能。将 smoothstep 函数与 opencv mat 对象一起使用的最佳或最有效的方法是什么?

这是一个示例代码:-

float smoothstep(float edge0, float edge1, float x) {
        // Scale, bias and saturate x to 0..1 range
        x = clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f);
        // Evaluate polynomial
        return x * x * (3 - 2 * x);
    }

    float clamp(float x, float lowerlimit, float upperlimit) {
        if (x < lowerlimit)
            x = lowerlimit;
        if (x > upperlimit)
            x = upperlimit;
        return x;
    }

Imgproc.GaussianBlur(mskmat, mskmat,new org.opencv.core.Size(3,3), 0);


    Utils.matToBitmap(mskmat,bitmap);
    save(bitmap,"mask");

    //Smoothing

    mskmat.convertTo(mskmat,CV_32F);

    for (int i=0; i<mskmat.rows(); i++)
    {
      for (int j=0; j<mskmat.cols(); j++)
      {
        double[] data = mskmat.get(i, j); //Stores element in an array

        for (int k = 0; k < 1; k++) //Runs for the available number of channels
        {
          data[k] = 255.0f * smoothstep(0.3f,0.5f, (float)data[k]/255.0f); //Pixel modification done here
        }
        Log.d("Value", Arrays.toString(data));
        mskmat.put(i, j, data); //Puts element back into matrix
      }
    }

    mskmat.convertTo(mskmat,CV_8U);

    Utils.matToBitmap(mskmat,bitmap);
    save(bitmap,"smoothmask");

但是这种方法似乎太慢了,输出不如标准的smoothstep函数好。

4

2 回答 2

0

OpenCV中没有等效的smoothstep函数。

于 2019-03-26T20:35:44.393 回答
0

AFAIK OpenCV 不提供与内置的 smoothstep GLSL 等效的功能。Smoothstep() 函数本身并不难实现(查看Wikipedia 上的 Smoothstep),并且可以在几行代码中完成。

不确定您的用例是什么,所以我猜测既然您提到在矩阵/图像上使用 smoothstep(),您想在两个图像之间混合。如果是这种情况,只需获取 smoothstep() 函数的输出并使用 smoothstep 和 1-smoothstep 执行线性组合。

于 2019-03-26T20:41:30.280 回答