不规则Contours内部像素的操作

在findContours函数使用了之后,有时候就会面临对Contours内部区域的访问。由于contours不一定是凸图形,所以使用循环操作的时候总感觉不那么方便。比如在下图中,已经使用findContours查找到边界并填充边界内部,然后与源图像进行and运算后的结果:

不规则Contours内部像素的操作_第1张图片

这时候要对非规则点的区域进行相关特征的计算,比如说是区域的灰度均值。观察图像的特征可以发现除了我们需要的点外,其他的都是黑色的背景(灰度值是0!)。那么就可以使用这个特点来除去背景点了。

步骤:

1、对每一个contours区域求它的包络矩形(为了方便遍历像素,就不使用旋转矩形)

  

	Mat drawing = Mat::zeros(m_SrcImg.size(), CV_8UC3 );
	for( int i = 0; i< m_contour->size(); i++ )
	{
		m_rect = boundingRect(m_contour->at(i));
		for (int nX=m_rect.x; nX<(m_rect.x+m_rect.width); ++nX)
		{
			for (int nY=m_rect.y; nY<(m_rect.y+m_rect.height); ++nY)
			{
				if (m_SrcImg.at<uchar>(nY,nX) == 0)
					continue;
				drawing.at<cv::Vec3b>(nY,nX)[0] = 0;
				drawing.at<cv::Vec3b>(nY,nX)[1] = 0;
				drawing.at<cv::Vec3b>(nY,nX)[2] = 255;
			}
		}
	}

<span style="font-family: 'Times New Roman'; font-size: 18px; background-color: rgb(255, 255, 255);">2、对矩形内的每一个像素点进行遍历,对矩形区域的像素遍历显然变得比较方便了。</span>

为了验证矩形区域的有效性,把矩形区域都用颜色标注出来

不规则Contours内部像素的操作_第2张图片

然后在像素遍历函数中来排除背景像素点就可以了,最后得到的效果如下,这就说明这种方式是可以实现的。

不规则Contours内部像素的操作_第3张图片





你可能感兴趣的:(opencv)