【问题标题】:how to modify values of Mat according to some condition in opencv?如何根据opencv中的某些条件修改Mat的值?
【发布时间】:2015-03-13 23:12:31
【问题描述】:

在 Matlab 中,a(a>50)=0 可以将a 中大于 50 的所有元素替换为 0。我想用 OpenCV 中的 Mat 做同样的事情。怎么做?

【问题讨论】:

  • a>50 为您提供了一个矩阵,其中在您的条件成立的任何地方都包含 0 个元素和 50)).copyTo(a, a>50) 例如会这样做。或者只使用a.setTo(cv::Scalar(0), a>50)

标签: matlab opencv image-processing mat


【解决方案1】:

呐。要做到这一点,只需一行:

cv::Mat img = imread('your image path');
img.setTo(0,img>50);

就这么简单。

【讨论】:

  • 正是我需要的!!
  • 我通常使用阈值方法......这也只是一种说法,但这更灵活,我喜欢它
【解决方案2】:

你想要的是用 cv::threshold 截断图像。

以下应该满足您的要求:

cv::threshold(dst, dst, 50, 0, CV_THRESH_TOZERO_INV);

这是函数定义

double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)

http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html?highlight=threshold#threshold

【讨论】:

  • 我认为OP实际上是在寻找THRESH_TOZERO_INV,它将大于阈值的值设置为0。THRESH_TRUNC将大于阈值的值设置为阈值。
  • 抱歉,OP 是“原始帖子”或“原始海报”...问题或提出问题的人。
  • 阈值的定义表明,不仅大于阈值的值将更改为最大值,而且会将所有小于阈值的值设置为 0。但我希望它们的值按原样小于阈值。
【解决方案3】:

有时阈值不起作用,因为您可以拥有不同种类的垫子。如果你的 Mat 类型支持 double,threshold 会崩溃(至少在我的 android studio 中)。

你可以在这里找到比较: 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 个的矩阵。之后,我使用 CMP_LT(小于)将它与 yourMat 进行比较。因此,所有小于 50 的像素将在您的掩码中变为 255,如果更大则为 0。这是一个面具。所以你可以:

yourMat.copyTo(yourMat, mask);

现在所有大于 50 的像素都将为零,其他所有像素都有自己的值。

【讨论】:

    猜你喜欢
    • 2022-09-23
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多