OpenCV4图像处理-图像交互式分割-GrabCut

本文将实现一个与人(鼠标)交互从而分割背景的程序。

GrabCut

  • 1.理论介绍
  • 2. 鼠标交互
  • 3. GrabCut

1.理论介绍

用户指定前景的大体区域,剩下为背景区域,还可以明确指出某些地方为前景或者背景,GrabCut算法采用分段迭代的方法分析前景物体形成模型树,最后根据权重决定某个像素是前景还是背景。

算法:GrabCut(img, mask, rect, bgdModel, fgdModel, 5, //iteratormode)
img:要分割的图像
mask:生称的掩码(以原图像大小为基准),该算法会把mask分为4部分,像素点的值为0,1,2,3四种值吗,其中每种值代表不同的意思。
rect:用户指定的矩形区域,元组的形式(起始坐标x, y , width,height)
bgdModel:1行65列的0矩阵,元素类型为float64。
fgdModel:1行65列的0矩阵,元素类型为float64。
5:迭代次数iterator
mode:第一次找用RECT,以后迭代用MASK

在这里插入图片描述

在这里插入图片描述

2. 鼠标交互

下面是一个鼠标交互的程序,可以通过点击鼠标滑动鼠标在图像上作图。

不太清楚的读者可以参考下面博客:Opencv(图像处理)-基于Python-绘图功能

代码如下:

import cv2
import numpy as np


'''
该api可以在图上作图
点击并滑动鼠标可以在图上画出矩形框
'''


# 定义一个类来封装该方法
class MouseStich:
    startX = 0
    startY = 0
    rect_flag = False
    def onmouse(self, event, x, y, flags, param):
        # print("onmouse")
        if event == cv2.EVENT_LBUTTONDOWN:
            self.rect_flag = True
            self.startX = x
            self.startY = y
            # print("LBUTTONDOWN")
        elif event == cv2.EVENT_LBUTTONUP:
            # print("LBUTTONUP")
            self.rect_flag = False
            cv2.rectangle(self.img,
                          (self.startX, self.startY),
                          (x, y),
                          (0, 0, 255),
                          3)
        elif event == cv2.EVENT_MOUSEMOVE:
            # print("MOUSEMOVE")
            # 每次都在新的图像上画
            if self.rect_flag == True:
                self.img = self.img2.copy()
                cv2.rectangle(self.img,
                              (self.startX, self.startY),
                              (x, y),
                              (0, 255, 0),
                              3)

    def run(self):
        print("run....")
        # 绑定鼠标事件的窗口
        cv2.namedWindow('input')
        cv2.setMouseCallback('input', self.onmouse)
		# 暂存一个img2
        self.img = cv2.imread('./image/lena.jpg')
        self. img2 = self.img.copy()
        # 读取图片,在该窗口显示
        while(1):
            # 展示原图,被画的图
            cv2.imshow('input', self.img)
            k = cv2.waitKey(100) & 0xff
            if k == ord('q'):
                break




MouseStich().run()

3. GrabCut

将GrabCut需要的参数构造好后,传进去,获得mask掩模,然后我们用np.where把像素值是1,3的位置改成255,目的是用bitwise_and函数提取出前景区域。

import cv2
import numpy as np


'''
该api可以在图上作图
点击并滑动鼠标可以在图上画出矩形框
'''


# 定义一个类来封装该方法
class MouseStich:
    startX = 0
    startY = 0
    rect_flag = False
    rect = (0, 0, 0, 0)
    def onmouse(self, event, x, y, flags, param):

        # print("onmouse")
        if event == cv2.EVENT_LBUTTONDOWN:
            self.rect_flag = True
            self.startX = x
            self.startY = y
            # print("LBUTTONDOWN")
        elif event == cv2.EVENT_LBUTTONUP:
            # print("LBUTTONUP")
            self.rect_flag = False
            cv2.rectangle(self.img,
                          (self.startX, self.startY),
                          (x, y),
                          (0, 0, 255),
                          3)
        elif event == cv2.EVENT_MOUSEMOVE:
            # print("MOUSEMOVE")
            # 每次都在新的图像上画
            if self.rect_flag == True:
                # 每次都在新的图像上画move
                self.img = self.img2.copy()
                cv2.rectangle(self.img,
                              (self.startX, self.startY),
                              (x, y),
                              (0, 255, 0),
                              3)
        # 构造矩形的信息
        self.rect = (min(self.startX, x), min(self.startY, y),
                     abs(self.startX - x), abs(self.startY - y))

    def run(self):
        print("run....")
        # 绑定鼠标事件的窗口
        cv2.namedWindow('input')
        cv2.setMouseCallback('input', self.onmouse)

        self.img = cv2.imread('./image/lena.jpg')
        self. img2 = self.img.copy()
        # 定义一个与图片相同大小的掩码
        self.mask = np.zeros(self.img.shape[:2], dtype=np.uint8)
        self.output = np.zeros(self.img.shape, dtype=np.uint8)


        # 读取图片,在该窗口显示
        while(1):
            # 展示原图,被画的图
            cv2.imshow('input', self.img)
            cv2.imshow('output', self.output)
            k = cv2.waitKey(100) & 0xff
            if k == ord('q'):
                break

            if k == ord('g'):
                bgdmodel = np.zeros((1, 65), np.float64)
                fgdmodel = np.zeros((1, 65), np.float64)
                cv2.grabCut(self.img2, self.mask, self.rect,
                            bgdmodel, fgdmodel,
                            1,
                            cv2.GC_INIT_WITH_RECT)
            # 构造提取前景的淹没
            mask2 = np.where((self.mask==1)|(self.mask==3), 255, 0).astype('uint8')
            self.output = cv2.bitwise_and(self.img2, self.img2, mask=mask2)



MouseStich().run()

展示效果:先使用鼠标画出区域,然后按’g’分割图片。

在这里插入图片描述

以上是关于GrabCut算法的实战内容,如有问题欢迎在评论区讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/43570.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.多线程-初阶(中)

文章目录 4. 多线程带来的的风险-线程安全 (重点)4.1 观察线程不安全4.2 线程安全的概念4.3 线程不安全的原因4.3.1原子性4.3.2可见性4.3.3代码顺序性 4.4 解决之前的线程不安全问题 5. synchronized[ˈsɪŋkrənaɪzd] 关键字-监视器锁monitor lock5.1 synchronized 的特性5.…

数据分享|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病...

全文链接:http://tecdat.cn/?p23061 这个数据集(查看文末了解数据免费获取方式)可以追溯到1988年,由四个数据库组成。克利夫兰、匈牙利、瑞士和长滩。"目标 "字段是指病人是否有心脏病。它的数值为整数,0无…

ElasticSearch学习--数据聚合

介绍 数据聚合可以帮助我们对海量的数据进行统计分析,如果结合kibana,我们还能形成可视化的图形报表。自动补全可以根据用户输入的部分关键字去自动补全和提示。数据同步可以帮助我们解决es和mysql的数据一致性问题。集群可以帮助我们了解结构和不同节点…

Flask 文件上传,删除上传的文件

目录结构 app.py from flask import Flask, request, render_template, redirect, url_for import osapp Flask(__name__) BASE_DIR os.getcwd() UPLOAD_FOLDER os.path.join(BASE_DIR, testfile)app.route(/) def home():files os.listdir(UPLOAD_FOLDER)return render_t…

回归预测 | MATLAB实现TCN-BiGRU时间卷积双向门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现TCN-BiGRU时间卷积双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现TCN-BiGRU时间卷积双向门控循环单元多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 ![6 基本介绍 1.MATLAB实现TCN-BiGRU时间卷积双向门控循…

解决JMeter+Grafana+influxdb 配置出现transaction无数据情形

问题描述 JMeterGrafanainfluxdb 配置时,Darren洋发现jmeter中明明已经配置好了事务条件以及接口实例信息,但就是在grafana的头部导航栏中的transaction按钮下来没有相应事务数据信息,经过相关资料查询,Darren洋发现执行以下两个步…

前端,测试,后端,该如何选择?

前端开发,测试,后端,该如何选择?说实话,只要对互联网行业有了解的,都会推荐你学测试。 首先必须声明,能在前端开发、测试、后端(主要是Java)这三个岗位中进行选择&#…

yum镜像源更新很慢,不管是阿里源还是清华源

今天想要再Centos7上安装docker测试,但是发现不管是阿里源还是清华源 yum makecache都更新的特别慢。有大佬知道啥原因不? 坐标成都,联通宽带300M

zabbix安装Grafana

一、web访问 https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.6.1-1.x86_64.rpm [rootserver ~] yum localinstall -y grafana-4.6.1-1.x86_64.rpm //yum方式安装本地rpm并自动解决依赖关系 [rootserver ~] grafana-cli plugins install alexanderzob…

分布式 RPC 框架HSF

分布式 RPC 框架HSF 概述HSF架构调用方式优势应用场景 概述 HSF (High-speed Service Framework),高速服务框架,是在阿里巴巴内部广泛使用的分布式 RPC 服务框架。HSF 作为阿里巴巴的基础中间件,联通不同的业务系统,解耦系统间的…

Network Dissection 论文阅读笔记

Network Dissection 论文阅读笔记 1. 简介2. 网络刨析2.1 深度视觉表征的可解释性的测量步骤2.2 数据集2.3 可解释神经元评分 3. 实验3.1 对解释的人类评价3.2 Measurement of Axis-Aligned Interpretability3.3 理解层概念3.4 网络架构和监督3.5 训练条件 vs 可解释性3.6 网络…

Windows上配置Python环境变量

Python配置环境变量 🍁博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! Python下载官网&#xff1…

新星计划打卡学习:VUE3组合式API

目录 1、vue3组件页面的构成 2、setup选项 3、reactive 4、ref 最后 1、vue3组件页面的构成 从上到下依次是 逻辑、结构、样式 2、setup选项 经过语法糖的封装更简单的使用组合式api <script setup> // 经过语法糖的封装更简单的使用组合式api const message t…

kubesphere安装中间件

kubesphere安装mysql 创建configMap [client] default-character-setutf8mb4[mysql] default-character-setutf8mb4[mysqld] init_connectSET collation_connection utf8mb4_unicode_ci init_connectSET NAMES utf8mb4 character-set-serverutf8mb4 collation-serverutf8mb4_…

Django笔记之in查询及date日期相关过滤操作

这一篇介绍关于范围&#xff0c;日期的筛选 inrangedateyearweekweekdayquarterhour 1、in in 对应于 MySQL 中的 in 操作&#xff0c;可以接受数组、元组等类型数据作为参数&#xff1a; Blog.objects.filter(id__in[1,2,3])对应的 SQL 是&#xff1a; select * from blo…

字符函数和字符串函数下篇(详解)

❤️ 作者简介 &#xff1a;RO-BERRY 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识&#xff0c;对纯音乐有独特的喜爱 &#x1f4d7; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;如果你也感兴趣的话欢迎关注博主&#xff0c;期待更新 字符函数和字符串函数2 1…

el-popover在原生table中,弹出多个以及内部取消按钮无效问题

问题&#xff1a;当el-popover和原生table同时使用的时候会失效&#xff08;不是el-table) <el-popover placement"bottom" width"500" trigger"click" :key"popover-${item.id}"></el-popover> 解决&#xff1a; :key…

C程序环境及预处理

​​​​​文章目录 一、程序的翻译环境和执行环境 1.程序编译过程 2.编译内部原理 3.执行环境 二、程序运行前的预处理 1.预定义符号归纳 2.define定义标识符 3.define定义宏 4.define替换规则 5.宏和函数的对比 三、头文件被包含的方式 四、练习&#xff1a;写一…

【python工具】html中表格转化为excel

背景 大家在实际的工作中可能会遇到这样的场景,查看某个统计的页面数据,其中一些数据是表格形式展示的,比如这是国家统计局关于人口统计的数据: 你想将表格内容下载下来根据自己的需要进行二次加工,但是页面没有提供下载功能或者需要你登陆才能下载。那么重点来了~~ 操…

科大讯飞-脑PET图像分析和疾病预测挑战赛(一)

报错尝试&#xff1a; sklearn安装 后面根据一篇博客才知道&#xff0c;sklearn不能直接安装&#xff0c;需要先安装scipy 最后就能直接运行了&#xff0c;但是又出现了一大难点&#xff0c;numpy包有报错了&#xff0c;不得不说&#xff0c;dependance尤其严重。暂时没想到很…