如何在分析OpenCV图像时跳过遮罩

How to skip over mask in analysis of OpenCV image

本文关键字:图像 OpenCV      更新时间:2023-10-16

我有一个掩码数组mask我有两个图像FG。我想对F执行一些统计信息(其中一些可能是自定义的,因此我需要能够访问特定元素),并且仅对那些mask为真的像素进行G

我可以遍历FG,然后查看mask的值,但遮罩功能非常自由,所以我真的只需要查看图像的 0.01%。在这种情况下,我将 99.99% 的时间花在 if 语句中,如果可能的话,我想尝试对这些操作进行矢量化(或者至少减少if比较,因为它可能是实质性的)。

我的问题是 - 我如何有效地只查看G F mask与真(或假......哪个在这里更有意义)?

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

为了解释这一点,我使用doublevector来存储强度,然后在分析中使用这些连续变量。在下面的代码中,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 );