【问题标题】:Dealing with pixels in contours (OpenCV)?处理轮廓中的像素(OpenCV)?
【发布时间】:2011-12-30 00:14:51
【问题描述】:

我已从图像中检索出轮廓,并希望专门处理轮廓中的像素。我需要找到轮廓中像素值的总和(而不是面积)。 OpenCV 只支持矩形的 ROI,所以我不知道怎么做。 cvSum 也只接受完整的图像并且没有遮罩选项,所以我对如何进行有点迷茫。有没有人对如何找到特定轮廓中像素值的总和有任何建议?

【问题讨论】:

  • 轮廓表示是什么?像素坐标?图像/面具?为什么不能只遍历像素?
  • 很抱歉,我不太明白这个问题。轮廓由围绕特定区域的一系列点组成。我不知道如何才能循环遍历像素。轮廓可以是任何形状 - 从人体轮廓到狗的轮廓 - 缺乏固定形状意味着我不能真正“循环”
  • 如果轮廓的像素在某个数组中作为坐标给出,则循环遍历该数组,从中取出坐标,然后使用这些坐标查看图像像素。如果轮廓在图像中并且其像素具有将它们与其他所有内容区分开来的特定颜色(或范围),则只需遍历图像像素并查看它们的颜色以查看它们是否是轮廓像素。如果你没有坐标并且轮廓像素没有特定的颜色范围,这是另一种问题,它更难。您没有指定表示。这就是我问它的原因
  • 你说得对,下次我会尽量让我的问题不那么含糊。但是,我没有坐标,也没有任何特定的像素颜色范围。我想我找到了解决问题的方法,但它会非常慢。我基本上使用 cvCopy 将每个轮廓的内容传输到新图像,然后找到该图像的总和。这会给我每个轮廓的像素值的总和,但是一个接一个地遍历每个轮廓会非常慢。您还有其他建议吗?
  • 我忘了说:我的应用程序是实时运行的,因此解决方案需要很高的速度。

标签: c++ algorithm opencv


【解决方案1】:

首先获取所有轮廓。使用此信息创建二值图像,其中白色部分是轮廓的轮廓和区域。对两个图像执行 AND 操作。结果将是黑色背景上的轮廓和区域。然后将这张图片中的所有像素相加。

【讨论】:

  • 首先,你的建议会给我所有轮廓的总和。我不完全希望每个总和分开。其次,正如我在问题中所说,我不想计算轮廓的面积,而是计算轮廓中已经非黑色的像素值。您的方法将使轮廓中的所有像素变为白色,完全违背了应用程序的要点。
  • 当你将二值图像和原始图像进行 AND 运算时,你得到的是一个孤立的图像。你不会得到一个全白的图像。如果您一次想要一个,您可以创建二进制掩码,然后一次将两个图像与一张。
  • 对不起,如果我没有很好地解释自己。但我自己也成功地做了类似的事情。
【解决方案2】:

如果我理解正确,您想对轮廓内的灰度图像中的所有像素强度求和。如果是这样,我想到的方法是在空白图像上绘制该轮廓并填充它,从而使自己成为蒙版。之后,为了优化过程,您还可以计算轮廓的边界矩形:

CvRect cvBoundingRect(CvArr* points, int update=0 );

在此之后,您可以使用以下方法制作中间图像:

void cvAddS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL);

使用值 0,从轮廓中获得掩码,并将边界矩形设置为 ROI。

在此之后,对结果图像的求和会快一点。

【讨论】:

  • 谢谢。据我了解,您基本上是通过使用蒙版来隔离轮廓内容。我知道它是如何工作的,但我并不真正理解边界矩形的用途。如果轮廓的内容已被隔离,那么拥有 ROI 有什么意义?
  • 重点是在计算总和或任何其他涉及遍历图像中每个像素的操作时,在较小的区域上工作。
【解决方案3】:

要单独访问轮廓点,请按照代码

vector<vector<Point> > contours;
...
printf("\n Contours pixels \n");
for(int a=0; a< contours.size(); a++)
{  
   printf("\nThe contour NO = %d  size = %d \n",a, contours[a].size() );
   for( int b = 0; b < contours[a].size();  b++ )  
   {  
       printf(" [%d, %d] ",contours[a][b].x, contours[a][b].y ); 
   }
}

【讨论】:

  • 这只会产生沿轮廓边缘的点。不是里面的像素。
猜你喜欢
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 2011-12-13
  • 1970-01-01
相关资源
最近更新 更多