我目前正在尝试计算轮廓中点的平均HSV . 我做了一些研究并遇到了分割功能,它允许将图像的垫片分解成它的通道,但轮廓数据类型是点的矢量 . 这是一个代码示例 .
findcontours(detected_edges,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
vector<vector<Point>> ContourHsvChannels(3);
split(contours,ContourHsvChannels);
基本上,目标是将轮廓的每个点分成HSV通道,这样我就可以对它们进行操作 . 任何指导将不胜感激 .
2 回答
您可以简单地将轮廓绘制到与原始图像大小相同的空白图像上以创建蒙版,然后使用它来遮罩图像(在HSV或您想要的任何颜色空间中) . mean()函数接收
mask
参数,以便您只获得掩码突出显示的值的平均值 .如果您还想要标准偏差,可以使用meanStdDev()函数,它也接受
mask
.这是Python中的一个例子:
有三个值;每个 Channels 一个 .
另一种选择是查找所有值;轮廓是一个点数组,因此您可以使用轮廓数组中每个轮廓的那些点索引图像,并将它们存储在各个数组中,然后在这些点上找到
meanStdDev()
或mean()
(而不用掩码) . 对于例如(再次在Python中,抱歉):所以这给出了相同的值 . 在Python中,我只是简单地为平均值和标准偏差创建空白列表并附加到它们 . 在C中,您可以为每个创建一个
std::vector<cv::Vec3b>
(假设为uint8
图像,否则为Vec3f
或其他任何适当的图像) . 然后在循环内部我创建另一个空白列表来保存每个轮廓的颜色;再次这将是一个std::vector<cv::Vec3b>
,然后在每个循环中对该向量运行meanStdDev()
,并将该值附加到均值和标准偏差向量 . 您不必追加,您可以轻松地获取轮廓的数量和每个轮廓中的点数并预先分配速度,然后只需索引到这些向量而不是追加 .在Python中,第二个例子中的内存效率更高;而不是存储整个空白
Mat
我们只存储一些值 . 然而,后端OpenCV方法对于屏蔽操作非常快速,因此您必须自己在C中测试速度差异,看看哪种方式更好 . 随着轮廓数量的增加,我想象第二种方法的好处会增加 . 如果您同时采取两种方法,请告诉我们您的结果!这是用c写的解决方案