Image Segmentation
程序员文章站
2022-07-07 22:53:46
...
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)。
图1 原图
图2 分割前景二值图
图3 分割前景图
推荐阅读
-
CSS3 border-image详解、应用及jQuery插件
-
C#byte数组与Image的相互转换实例代码
-
瑞芯微ROCK960 RK3399烧录image后扩容rootfs
-
image-set实现Retina屏幕下图片显示详细介绍
-
iOS-关于缓存【SDImageCache】Image,一直刷新UIImageView内存一直增加问题
-
C#无损转换Image为Icon的方法
-
微信小程序image图片加载完成监听
-
How to run and use SWF To Image on x64 Windows
-
vue-image-crop基于Vue的移动端图片裁剪组件示例
-
firefox background-image垂直平铺问题的解决方法