opencv(java)中是否有等效的'smoothstep'函数?它通常在opengl / glsl中使用,并且可以在许多其他标准图像处理库中作为标准内置函数使用。它使用阈值/钳位功能的组合。在opencv mat对象上使用smoothstep函数的最佳或最有效方法是什么?
这是示例代码:-
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");
但是这种方法似乎太慢,并且输出不如标准的平滑步长函数
。答案 0 :(得分:0)
OpenCV中没有smoothstep
函数的等效项。
答案 1 :(得分:0)
AFAIK OpenCV不提供与内置的smoothstep GLSL等效的功能。 smoothstep()函数本身并不难实现(请检查Smoothstep on Wikipedia),并且可以用几行代码来完成。
不知道您的用例是什么,所以我猜想由于您提到要在矩阵/图像上使用smoothstep(),因此您希望在两个图像之间进行混合。如果是这种情况,只需获取smoothstep()函数的输出,然后使用smoothstep和1-smoothstep进行线性组合。