C++ OpenCV图像分析中如何跳过掩模
我有一个掩码数组C++ OpenCV图像分析中如何跳过掩模,c++,opencv,C++,Opencv,我有一个掩码数组mask,我有两个图像F和G。我想对F和G仅对mask为真的像素执行一些统计(其中一些可能是自定义的,因此我需要能够访问特定元素) 我可以在F和G之间循环,然后查看mask的值,但是掩蔽函数非常自由,所以我只需要查看大约.01%的图像。在这种情况下,我花费99.99%的时间在if语句中,如果可能的话,我想尝试对这些操作进行矢量化(或者至少减少if比较,因为这可能是大量的) 我的问题是-我如何才能有效地只查看F和G中那些mask与真(或假…这里哪个更有意义)关联的像素?正如前面指出
mask
,我有两个图像F
和G
。我想对F
和G
仅对mask
为真的像素执行一些统计(其中一些可能是自定义的,因此我需要能够访问特定元素)
我可以在F
和G
之间循环,然后查看mask
的值,但是掩蔽函数非常自由,所以我只需要查看大约.01%的图像。在这种情况下,我花费99.99%的时间在if
语句中,如果可能的话,我想尝试对这些操作进行矢量化(或者至少减少if
比较,因为这可能是大量的)
我的问题是-我如何才能有效地只查看
F
和G
中那些mask
与真(或假…这里哪个更有意义)关联的像素?正如前面指出的,讨论对原始像素的矢量化操作毫无意义,因为它们在内存中几乎肯定不是连续的
为了说明这一点,我使用了一个向量的双来存储强度,然后在分析中使用这些连续变量。在下面的代码中,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) );
}
正如所指出的,讨论对原始像素的矢量化操作毫无意义,因为它们几乎肯定不会在内存中连续
为了说明这一点,我使用了一个向量的双来存储强度,然后在分析中使用这些连续变量。在下面的代码中,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) );
}
1) 大多数OpenCV函数都接受掩码作为输入参数。2) 或者,您可以在for循环中检查掩码值,如您所述。这并不是很慢,只是用一种聪明的方式。3) 或者,您可以使用findNonZero
获取掩码中所有非零的点。在任何情况下,您都需要扫描遮罩。如果您有一个想要执行的操作的示例,我们可以给出更详细的答案。使用std::vector而不是mask如何?对于内存中稀疏分布的元素,向量化应该如何工作/受益?一开始你考虑过使用稀疏矩阵吗?1)大多数OpenCV函数都接受掩码作为输入参数。2) 或者,您可以在for循环中检查掩码值,如您所述。这并不是很慢,只是用一种聪明的方式。3) 或者,您可以使用findNonZero
获取掩码中所有非零的点。在任何情况下,您都需要扫描遮罩。如果您有一个想要执行的操作的示例,我们可以给出更详细的答案。使用std::vector而不是mask如何?对于内存中稀疏分布的元素,向量化应该如何工作/受益?一开始你有没有想过使用稀疏的垫子?