如何在OpenCV中实现signum功能?

ZHO*_*HOU 0 math android opencv

dst = signum(src)函数将所有正元素的值设置为srcto 1,并将所有负元素的值设置为-1.

但是,似乎无法signum()通过应用OpenCV函数来实现该功能threshold().我也不想遍历src,因为它效率低下.

sga*_*zvi 5

我不知道你使用的是哪种语言,但在OpenCV C++中,signum函数可以实现如下:

Mat signum(Mat src)
{
    Mat dst = (src >= 0) & 1;
    dst.convertTo(dst,CV_32F, 2.0, -1.0);
    return dst;
}
Run Code Online (Sandbox Code Playgroud)

当然,返回的矩阵将具有浮点或有符号类型以存储值-1.

更新:

前一个实现仅返回1或-1,具体取决于输入值,但根据signum定义,0应在输出中保持为0.因此,从这个答案中获得参考,标准signum函数可以使用OpenCV实现如下:

Mat signum(Mat src)
{
    Mat z = Mat::zeros(src.size(), src.type()); 
    Mat a = (z < src) & 1;
    Mat b = (src < z) & 1;

    Mat dst;
    addWeighted(a,1.0,b,-1.0,0.0,dst, CV_32F);
    return dst;
}
Run Code Online (Sandbox Code Playgroud)