matlab 去掉小轮廓,OpenCV的轮廓:如何消除小轮廓二进制图像(Contours opencv : How to el...

我目前正在对图像处理项目。 我使用Opencv2.3.1用VC ++。 我已经写,使得在输入图像进行滤波以仅蓝色和转换为二进制图像的代码。 二进制图像有,我不想要一些小物件。 我想消除这些小物件,所以我用的OpenCV的cvFindContours()方法来检测二值图像的轮廓。 但问题是我不能消除图像输出的小物件。 我用cvContourArea()函数,但没有正常工作..,侵蚀功能也不能正常工作。

所以,请人帮我解决这个问题..

我所获得的二值图像 :

6c1555302777729326ca3efa0910d9ec.png

我想获得的结果/输出图像 :

6c1555302777729326ca3efa0910d9ec.png

Answer 1:

好吧,我相信你的问题可以用得到解决边界框演示最近推出的OpenCV。

6c1555302777729326ca3efa0910d9ec.png

正如你可能已经注意到了,对象你有兴趣的应该是画面中的最大矩形平局内。 幸运的是,这个代码不是很复杂,我敢肯定,你可以通过调查和用它进行试验弄清楚这一切了。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值