如何在分析OpenCV图像时跳过掩码

时间:2016-02-03 19:51:57

标签: c++ opencv

我有一个掩码阵列mask,我有两张图片FG。我想在FG上执行一些统计信息(其中一些可能是自定义的,因此我需要能够访问特定元素)仅适用于{{1}的像素是真的。

我可以循环遍历maskF,然后查看G的值,但是掩码函数非常自由,所以我真的只需要查看一下.01我的形象百分比。在这种情况下,我将99.99%的时间花在mask语句中,并且我想尽可能地尝试对这些操作进行矢量化(或者至少减少if比较,因为它可能是实质性的)。

我的问题是 - 如何才能有效地仅查看ifFG关联到true的那些像素(或者错误...这里更合理的是哪个) ?

1 个答案:

答案 0 :(得分:0)

正如所指出的那样,谈论对原始像素进行矢量化操作几乎没有意义,因为它们几乎肯定不会在内存中连续。

为了解释这一点,我使用vector double来存储强度,然后在我的分析中使用这些连续变量。在下面的代码中,X是我用作掩码的图像,RG是我想要从中获取强度的单独图像。

cv::Mat locs;
cv::findNonZero(X, locs);

std::vector< double > Rs(locs.rows);
std::vector< double > Gs(locs.rows);

for(int ip = 0; ip < locs.rows; ip++) {
    cv::Point p = locs.at<cv::Point>(ip);
    Rs[ip] = ( (double)R.at<uchar>(p) );
    Gs[ip] = ( (double)G.at<uchar>(p) );
}

然后,我可以将此子集传递给我想要的任何函数,并以矢量化的方式处理数据,如果我这样选择:

double myValue = myFunction( Rs, Gs );