grabcut 图像目标分割(1)

本文通过OpenCV库实现GrabCut图像目标分割,展示如何利用鼠标交互选取对象并进行初步的图像处理。实验结果显示,对于灰度图和HSV图像,GrabCut能提供更清晰的分割边缘。讨论了手动选择矩形区域对结果的影响,并表达了对自动化目标区域识别的期望。
摘要由CSDN通过智能技术生成

代码:

#include<opencv2/opencv.hpp>
bool selectObject = false;
cv::Point origin;
cv::Rect selection;
cv::Mat src;
cv::Mat srcMarks;
cv::Mat result;
cv::Mat foreground;
void GrabCutSegment();
 void onMouse(int event, int x, int y, int, void*)
{
    if (selectObject)
    {
        selection.x = MIN(x, origin.x);
        selection.y = MIN(y, origin.y);
        selection.width = std::abs(x - origin.x);
        selection.height = std::abs(y - origin.y);


        selection &= cv::Rect(0, 0, src.cols, src.rows);
    }
    switch (event)
    {
    case cv::EVENT_LBUTTONDOWN:
        origin = cv::Point(x, y);
        selection = cv::Rect(x, y, 0, 0);
        selectObject = true;
        break;
    case cv::EVENT_LBUTTONDOWN && cv::EVENT_MOUSEMOVE:
        src.copyTo(srcMarks);
        cv::rectangle(srcMarks, selection, cv::Scalar(255, 0, 0));
        imshow("srcMarks", srcMarks);
        break;
    case cv::EVENT_LBUTTONUP:
        selectObject = false;
        if (selection.width != 0 && selection.height != 0){
            GrabCutSegment();
        }
        break;
    }
}


void GrabCutSegment(){
    cv::Mat bgModel, fgModel;
    cv::grabCut(src, result, selection, bgModel, fgModel, 5, cv::GC_INIT_WITH_RECT);
    cv::compare(result, cv::GC_PR_FGD, result, cv::CMP_EQ);
    // Generate output image
    foreground = cv::Mat::ones(src.size(), CV_8UC3);
    src.copyTo(foreground, result); // bg pixels not copied
    
    cv::imshow("segment", foreground);
}
int main(){
    src = cv::imread("hui.png");
cv::namedWindow("src",CV_WINDOW_NORMAL);
    cv::imshow("src", src);


    cv::namedWindow("srcMarks",CV_WINDOW_NORMAL);
    src.copyTo(srcMarks);
    cv::setMouseCallback("srcMarks", onMouse, 0);
    cv::imshow("srcMarks", srcMarks);


    cv::waitKey();
    

}

对不同颜色格式图片分割初步结果:

第一次对灰度图像处理的结果(原图无法处理,原因了解中,可能图像过大)


对hsv图像进行处理:(与灰度图像相比边缘更为整齐,效果更好。会进一步了解算法原理)


对二次对灰度图处理(明显比第一次好,可见手动选择矩形区域的重要性,最终目的想要省去交互的这一步,希望更加精确的自动确定目标区域并用grabcut分割)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值