使用opencv C ++进行图像(颜色?)分割

时间:2015-05-18 12:24:04

标签: c++ opencv image-segmentation

http://i.imgur.com/iIv4gJa.png

如图所示,我想输入图片并得到几个片段。

它就像聚类最接近的颜色段一样,所以我认为它接近" meanshift"的概念?

我在这里搜索过相关问题,但仍然不知道如何在opencv C ++中启动和构建结构。我正在寻找一些建议,如果获得一段实施代码供我参考,我将非常感激!谢谢你的帮助!!

=============================================== ===

编辑2015年5月19日

让我补充一点,我尝试的实现之一是Watershed:(http://blog.csdn.net/fdl19881/article/details/6749976)。

enter image description here

它并不完美,但我想要的结果。在这个工具中,用户需要手动操作(绘制分水线),所以我正在寻找它的AUTOMATIC版本。听起来有点难,但是......我会感谢你提出一些建议或一些代码。

2 个答案:

答案 0 :(得分:2)

Opencv文档:Link

参数:here

Meanshift过滤的示例代码:

#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;
using namespace std;

Mat img, res, element;

int main(int argc, char** argv)
{

   namedWindow( "Meanshift", 0 );
   img = imread( argv[1] );
// GaussianBlur(img, img, Size(5,5), 2, 2);
   pyrMeanShiftFiltering( img, res, 20, 45, 3);
   imwrite("meanshift.png", res);
   imshow( "Meanshift", res );

   waitKey();

   return 0;
}

这是您的图片输出,您可能需要先使用一些预处理,或者找一些更好的参数:

output

编辑:预先输出一些高斯模糊(代码注释)

here

答案 1 :(得分:1)

查看现有细分方法的问题在于它们要么在Matlab中实现(Uni之外没有人可以使用),要么它们不是自动的。用户需要通过选择感兴趣的对象或指示如何分割颜色的级别来预处理图片的方法是没有用的,因为它不是自动的。如果您愿意,可以尝试使用此blog post中描述的基于OpenCV的细分实现。它并不完美,但它是自动的,完成大部分工作,你可以实际下载源代码并试用它。