grabcut分割算法简单且效果较好,初步决定将其应用到项目中,为了省去其人机交互的部分考虑到图像的显著性,查看的基本方法大多涉及机器学习。由于我们的项目待处理图像较为规整,于是想到每幅图片均提取相同的矩形区域,为grabcut算法提供先验像素。具体代码如下:
#include"highgui.h"
#include"cv.h"
using namespace cv;
Rect selection;
Mat img,img0;
int main()
{
Mat srcMarks;
img = imread("1.jpg");
imshow("原图", img);
img0 = img.clone();
//绘制合适大小的矩形区域:
selection = cv::Rect(20,150,850,300);img.copyTo(srcMarks);
cv::rectangle(srcMarks, selection, cv::Scalar(255, 0, 0),1,1,0);
imshow("srcMarks",srcMarks);
waitKey(100);
Mat result; // 4种可能结果
Mat bgModel, fgModel; // 背景/前景
grabCut(srcMarks, result, selection, bgModel, fgModel, 5, GC_INIT_WITH_RECT);
compare(result,GC_PR_FGD,result,CMP_EQ);//得到前景mask
Mat foreground(img.size(),CV_8UC3,Scalar::all(255));
img0.copyTo(foreground,result);
imshow("grabcut",foreground);
waitKey();
}
初步实现了我们的想法,仍存在的问题:
1、图片素材大小不一,需预先将所有图像大小标准化。
2、速度较慢。