如何根据opencv中的某些条件修改Mat的值?
how to modify values of Mat according to some condition in opencv?
在 Matlab 中 a(a>50)=0
可以将 a
中大于 50 的所有元素替换为 0。我想在 OpenCV 中对 Mat 做同样的事情。怎么做?
你想要的是用cv::threshold截断图像。
以下应该满足您的要求:
cv::threshold(dst, dst, 50, 0, CV_THRESH_TOZERO_INV);
这是函数定义
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
有时阈值不起作用,因为您可以使用不同种类的垫子。如果你的 Mat 类型支持 double,threshold 将会崩溃(至少在我的 android 工作室)。
你可以在这里找到比较:
http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html
所以我使用函数比较:
Mat mask = new Mat(yourMat.rows(), yourMat.cols(), CvType.CV_64FC1);
Mat ones = org.opencv.core.Mat.ones(yourMat.rows(), yourMat.cols(), CvType.CV_64FC1);
Scalar alpha = new Scalar(50, CvType.CV_64FC1);
Core.multiply(ones, alpha, ones);
Core.compare(yourMat, zeros, mask, Core.CMP_LT);
这里我创建了一个所有点都只有 50 的矩阵。之后我将它与 yourMat 进行比较,使用 CMP_LT(小于)。因此,所有小于 50 的像素将在您的蒙版中变为 255,如果更大则变为 0。这是一个面具。所以你可以:
yourMat.copyTo(yourMat, mask);
现在所有大于 50 的像素都将为零,所有其他像素都有自己的值。
不行。为此,只需一行:
cv::Mat img = imread('your image path');
img.setTo(0,img>50);
就这么简单。
在 Matlab 中 a(a>50)=0
可以将 a
中大于 50 的所有元素替换为 0。我想在 OpenCV 中对 Mat 做同样的事情。怎么做?
你想要的是用cv::threshold截断图像。
以下应该满足您的要求:
cv::threshold(dst, dst, 50, 0, CV_THRESH_TOZERO_INV);
这是函数定义
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
有时阈值不起作用,因为您可以使用不同种类的垫子。如果你的 Mat 类型支持 double,threshold 将会崩溃(至少在我的 android 工作室)。
你可以在这里找到比较: http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html
所以我使用函数比较:
Mat mask = new Mat(yourMat.rows(), yourMat.cols(), CvType.CV_64FC1);
Mat ones = org.opencv.core.Mat.ones(yourMat.rows(), yourMat.cols(), CvType.CV_64FC1);
Scalar alpha = new Scalar(50, CvType.CV_64FC1);
Core.multiply(ones, alpha, ones);
Core.compare(yourMat, zeros, mask, Core.CMP_LT);
这里我创建了一个所有点都只有 50 的矩阵。之后我将它与 yourMat 进行比较,使用 CMP_LT(小于)。因此,所有小于 50 的像素将在您的蒙版中变为 255,如果更大则变为 0。这是一个面具。所以你可以:
yourMat.copyTo(yourMat, mask);
现在所有大于 50 的像素都将为零,所有其他像素都有自己的值。
不行。为此,只需一行:
cv::Mat img = imread('your image path');
img.setTo(0,img>50);
就这么简单。