2014-07-07 25 views
4

在OpenCV中()用作MAX在MATLAB:其功能可以ı在Matlab

max(image,0) 

设置负值为零。 OpenCV中有没有可用的功能呢?

+1

可能不是,但它非常容易编码。只需迭代Matrix值,如果它们小于0,则将它们设置为零。它的4行代码LITERALLY。在Matlab中,使用矩阵内建函数比单元迭代更快,但在C++中,迭代没有问题。 –

+1

@AnderBiguri无需迭代,可以使用Mat表达式(MatExpr)。看到我的答案下面;) –

回答

8

其实完全一样的语法适用:

Mat im = cv::imread("..."); 
Mat im_capped = cv::max(im, 0); 

或者,如果你想给它相同大小的零矩阵:

Mat thresh(im.size(), im.type(), Scalar::all(0)); 
Mat im_capped = cv::max(im, thresh); 

按照docs

cv::max

+0

这是正确的答案。我是正确的,但这正是OP所要求的:D –

+1

hmmm ..现在我在想..哪种方法更快? –

+1

那么这里是['Mat :: setTo'](https://github.com/Itseez/opencv/blob/master/modules/core/src/copy.cpp#L412)的源代码,这里是[ 'cv :: max'](https://github.com/Itseez/opencv/blob/master/modules/core/src/arithm.cpp#L1079)(实际上它调用一个通用函数'binary_op',它实现了许多类似的二进制运算符) – Amro

4

您可以使用类似:

Mat im = ReadSomeImage(...); 
Mat masked = im.setTo(0,im<0); /// <<< 

setTo(0,im<0)做你所需要的。

+2

会http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#MatExpr%20max%28const%20Mat&%20a,%20double%20s%29也工作? – Trilarion

+2

@Trilarion:是的,它会:) – Amro

+0

糟糕,更好! :) –