如何根据opencv中的某些条件修改Mat的值?

时间:2015-01-15 14:19:18

标签: opencv mat

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

3 个答案:

答案 0 :(得分:6)

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

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

就这么简单。

答案 1 :(得分:4)

你想要的是用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

答案 2 :(得分:0)

有时阈值不起作用,因为你可以使用不同类型的Mat。如果您的Mat类型支持double,则阈值将崩溃(至少在我的android工作室中)。

你可以在这里找到比较: http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html

所以我使用比较函数:

(a, b) -> 5

这里我创建的矩阵在所有点上只有50个。之后,我将它与yourMat进行比较,使用CMP_LT(小于)。因此,所有小于50的像素将在掩码中变为255,如果大则变为0。这是一个面具。所以你可以:

<?php


    $data = array(
            'WebDevelopment' => array(
                'Frontend' => array(
                    'HTML' =>'Hypertext Markup Langauge' , 
                    'CSS' => 'Cascading style sheet',
                    'Js' => 'Java Script'
                    ), 
                'Backend' => array(
                    'PHP' => 'Hypertex Preprocessor',
                    'Ajax'=> 'Asynchronus Js and Xml' )
                ) 
             );

         foreach ($data as $subject => $course) {
            echo "$subject";
            foreach ($course as $part => $value) {
                echo "$part";
                foreach ($value as $Langauge => $description) {
                    echo "$Langauge : $description";
                }
            }
         }
    ?>

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