Image Segmentation

1. GrabCut算法实现分割

GrabCut算法比较复杂,计算量也很大,但通常很精确。

#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>

int main()
{
    cv::Mat_<cv::Vec3b> img = cv::imread("castle.jpg");
    cv::resize(img, img, cv::Size(img.cols/3,img.rows/3));
    cv::Mat result;                      // 分割结果,有四种可能的值
    cv::Mat bgModel, fgModel;            // 模型(算法内部使用)
    /* 定义矩形,矩形外部的像素是背景 */
    cv::Rect rectangle = cv::Rect(780 / 3, 410 / 3, 400 / 3, 400 / 3);
    /* GrabCut分割算法 */
    cv::grabCut(img,                     // 输入图像
                result,                  // 分割结果
                rectangle,               // 指定的前景区域
                bgModel, fgModel,        // 存放算法构建的模型
                5,                       // 迭代次数
                cv::GC_INIT_WITH_RECT);  // 使用矩形
    /* 获取标记为“可能是前景”的像素 */
    cv::compare(result, cv::GC_PR_FGD, result, cv::CMP_EQ);
    /* 前景图像 */
    cv::Mat foreground(img.size(), CV_8UC3, cv::Scalar(255, 255, 255));
    /* 仅拷贝算法认为可能是前景的区域 */
    img.copyTo(foreground, result);

    cv::imshow("foreground", foreground);
    cv::imshow("result", result);
    cv::imshow("img", img);
    cv::waitKey(0);
}

原图是图1(img),分割后二值图是图2(result),分割后前景图是图3(foreground)。

ellipse
图1 原图
ellipse
图2 分割前景二值图
ellipse
图3 分割前景图
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值