我目前正在对图像处理项目。 我使用Opencv2.3.1用VC ++。 我已经写,使得在输入图像进行滤波以仅蓝色和转换为二进制图像的代码。 二进制图像有,我不想要一些小物件。 我想消除这些小物件,所以我用的OpenCV的cvFindContours()方法来检测二值图像的轮廓。 但问题是我不能消除图像输出的小物件。 我用cvContourArea()函数,但没有正常工作..,侵蚀功能也不能正常工作。
所以,请人帮我解决这个问题..
我所获得的二值图像 :
我想获得的结果/输出图像 :
Answer 1:
好吧,我相信你的问题可以用得到解决边界框演示最近推出的OpenCV。
正如你可能已经注意到了,对象你有兴趣的应该是画面中的最大矩形平局内。 幸运的是,这个代码不是很复杂,我敢肯定,你可以通过调查和用它进行试验弄清楚这一切了。
Answer 2:
这里是我的解决方案,以消除小轮廓。 其基本思想是检查长度/面积为每个轮廓,则删除从矢量容器中较小的一个。
通常你会得到这样的轮廓
Mat canny_output; //example from OpenCV Tutorial
vector > contours;
vector hierarchy;
Canny(src_img, canny_output, thresh, thresh*2, 3);//with or without, explained later.
findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0,0));
用Canny()预处理,将得到的轮廓段,然而每个段被存储与边界像素作为封闭的环。 在这种情况下,你可以检查长度并删除小一个样
for (vector >::iterator it = contours.begin(); it!=contours.end(); )
{
if (it->size()
it=contours.erase(it);
else
++it;
}
如果没有坎尼()预处理,你会得到对象的轮廓。 相似性,你也可以使用区域来定义阈值,以消除小的物体,如OpenCV的教程
vector contour = contours[i];
double area0 = contourArea(contour);
此contourArea()是非零的像素数
Answer 3:
你是小轮廓面积确保过滤没有工作? 它总是为我工作。 我们可以看到你的代码?
此外,作为苏玲提到,它的使用既侵蚀和扩张到大约保持区域是一个好主意。 要除去小吵位,使用第一侵蚀,并在洞填补,使用扩张第一。
而另一边,你可能想看看新的C ++的版本cv *功能,如果你不知道他们已经( 文档为findContours )。 他们是非常容易使用,在我看来。
Answer 4:
在之前和之后的图像来看,你需要确定所有的白色区域或斑点的面积,然后应用阈值面积值。 这将消除小于该值的所有领域,只留下这第二图像中看到的大的白色区域。 使用cvFindContours功能后,尝试使用0阶矩。 这将返回图像中的斑点的面积。 此链接可能是在执行我刚才描述的帮助。 http://www.aishack.in/2010/07/tracking-colored-objects-in-opencv/
Answer 5:
我相信你可以使用形态学运营商如侵蚀和扩张(阅读更多这里 )
你需要一个内核的大小接近右侧(您想消除的)圆的半径进行侵蚀。 随后扩张使用相同的内核以填充由侵蚀步骤产生的间隙。
仅供参考使用侵蚀相同的内核,然后扩张被称为开放。
代码会是这样的
int erosion_size = 30; // adjust with you application
Mat erode_element = getStructuringElement( MORPH_ELLIPSE,
Size( 2*erosion_size + 1, 2*erosion_size+1 ),
Point( erosion_size, erosion_size ) );
erode( binary_img, binary_img, erode_element );
dilate( binary_img, binary_img, erode_element );
Answer 6:
这不是一个快速的方法,但可能在某些情况下有用。 有一个在OpencCV 3.0新功能 - connectedComponentsWithStats。 有了它,我们可以得到连接部件的面积和消除不必要的。 因此,我们可以轻松去除圆,孔,用相同的边框为实线的圆。
文章来源: Contours opencv : How to eliminate small contours in a binary image