【问题标题】:cv::mean for non black pixelcv::mean 非黑色像素
【发布时间】:2015-11-04 20:12:28
【问题描述】:

我想在非黑色像素上对cv::mat 执行cv::mean。使用以下掩码很容易做到这一点:

cv::threshold(image, thresholded, 0, 255, cv::THRESH_BINARY);
return cv::mean(image,thresholded);

但是,有没有更快的方法?也许是 OpenCV 中的某种内置颜色屏蔽技术?

附:我所说的黑色是指(0)(0,0,0);不应该发生舍入。

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    更紧凑的形式是:

    Scalar mm = mean(img, img > 0);
    

    还要注意这样做:

    threshold(image, thresholded, 1, 255, cv::THRESH_BINARY);
    

    您正在屏蔽所有大于 1 的像素,即 0 和 1 都将设置为 0。您需要:

    threshold(image, thresholded, 0, 255, cv::THRESH_BINARY);
    

    屏蔽所有非零像素。


    性能

    这个方法也快一点:

    With threshold: 6.98269
    With > 0 : 4.75043
    

    测试代码:

    #include "opencv2/opencv.hpp"
    #include <iostream>
    using namespace std;
    using namespace cv;
    
    int main(int, char**)
    {
        Mat1b img(1000, 1000);
        randu(img, 0, 3);
    
        {
            double tic = double(getTickCount());
            Mat1b thresholded;
            threshold(img, thresholded, 0, 255, cv::THRESH_BINARY);
            Scalar m = cv::mean(img, thresholded);
            double toc = (double(getTickCount()) - tic) * 1000.0 / getTickFrequency();
    
            cout << "With threshold: " << toc << endl;
        }
    
        {
            double tic = double(getTickCount());
            Scalar m = mean(img, img > 0);
            double toc = (double(getTickCount()) - tic) * 1000.0 / getTickFrequency();
    
            cout << "With > 0 : " << toc << endl;
        }
    
        getchar();
        return 0;
    }
    

    【讨论】:

    • 感谢您的回答和注意 ;)
    • @HumamHelfawi 很高兴它有帮助
    • @Micka 你是对的。我相应地更改了代码。感谢您指出这一点。
    • 您是否有类似的简单方法可以使用 PIL 而不是 cv?
    • @agent 不抱歉。您可以提出一个新问题
    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 2016-06-14
    相关资源
    最近更新 更多