【发布时间】:2017-09-21 09:28:41
【问题描述】:
我的标题可能不够清楚,但请仔细看下面的描述。提前谢谢。
我有一个 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++;
}
}
}
坐标如下: enter image description here
但是,这两层 for 循环花费了太多时间。我想知道是否有更快的方法来获得颜色,希望你们能理解我试图传达的意思。
PS:如果我会用python的话,一句话就能搞定:
colors = img[mask == 1]
【问题讨论】:
-
为什么目的地
Mat被称为coords,而不是存储坐标,而是来自输入图像的像素值? |此外,该 Python 代码不正确,numpy 数组不可调用。你的意思是img[mask==1]?此外,它也不会生成坐标列表。 -
感谢您的善意提醒:)