我有一个掩码阵列mask
,我有两张图片F
和G
。我想在F
和G
上执行一些统计信息(其中一些可能是自定义的,因此我需要能够访问特定元素)仅适用于{{1}的像素是真的。
我可以循环遍历mask
和F
,然后查看G
的值,但是掩码函数非常自由,所以我真的只需要查看一下.01我的形象百分比。在这种情况下,我将99.99%的时间花在mask
语句中,并且我想尽可能地尝试对这些操作进行矢量化(或者至少减少if
比较,因为它可能是实质性的)。
我的问题是 - 如何才能有效地仅查看if
和F
中G
关联到true的那些像素(或者错误...这里更合理的是哪个) ?
答案 0 :(得分:0)
正如所指出的那样,谈论对原始像素进行矢量化操作几乎没有意义,因为它们几乎肯定不会在内存中连续。
为了解释这一点,我使用vector
double
来存储强度,然后在我的分析中使用这些连续变量。在下面的代码中,X
是我用作掩码的图像,R
和G
是我想要从中获取强度的单独图像。
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 );