我的标题可能不够清晰,但请仔细阅读以下描述。先谢谢了。
我有一张RGB图像和一张二进制掩码图像:
Mat img = imread("test.jpg")
Mat mask = Mat::zeros(img.rows, img.cols, CV_8U);
给口罩上一些1,假设1的个数为N。现在已知非零坐标,基于这些坐标,我们可以确定原始图像相应像素的RGB值。我知道可以通过以下代码完成:
Mat colors = Mat::zeros(N, 3, CV_8U);
int counter = 0;
for (int i = 0; i < mask.rows; i++)
{
for (int j = 0; j < mask.cols; j++)
{
if (mask.at<uchar>(i, j) == 1)
{
colors.at<uchar>(counter, 0) = img.at<Vec3b>(i, j)[0];
colors.at<uchar>(counter, 1) = img.at<Vec3b>(i, j)[1];
colors.at<uchar>(counter, 2) = img.at<Vec3b>(i, j)[2];
counter++;
}
}
}
坐标将如下所示:点击此处查看图片
然而,这两层for循环的时间成本太高了。我想知道是否有更快的方法来获取颜色,希望大家能理解我的意思。
附:如果我可以使用Python,这只需要一句话就可以完成:
colors = img[mask == 1]
Mat
被称为coords
,当你不是在其中存储坐标,而是从输入图像中存储像素值?| 此外,该Python代码是错误的,numpy数组不可调用。您是否意味着img[mask==1]
?此外,它也不会产生坐标列表。 - Dan Mašek