IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Opencv中的GrabCut图像分割 -> 正文阅读

[人工智能]Opencv中的GrabCut图像分割

文章目录

1.GrabCut

通过交互的方式获得前景物体;
原理:
(1)用户指定前景的大体区域,剩下的为背景区域;
(2)用户也可以明确指定某些地方为前景或者背景;
(3)GrabCut采用分段迭代的方式分析前景物体形成模型树;
(4)通过权重决定某个像素是前景还是背景;

 grabCut(img, mask, rect, bgdModel, fgdModel, iterCount, mode=None): 

Img:输入的原始图像;
Mask:分割之后产生的掩码;
Rect:使用鼠标选取的区域大小;
bgdModel:np.float64 ;大小为1-65且为零的数组;
fgdModel:np.float64 ;大小为1-65且为零的数组;
Intercount:迭代的次数;
Mode:GC_INIT_WITH_RECT;GC_INIT_WITH_MASK;

输出的Mask对应的每个像素值:
BGD:背景-0;
FGD:前景-1;
PR_BGD:可能是背景-2;
PR_FGD:可能是前景-3;

import os
import cv2
import numpy as np

#定义结构类
class App:
    flag=False
    startX=0
    startY=0
    rect=(0,0,0,0)
    def onmouse(self,event,x,y,flags,param):
        if(event&cv2.EVENT_LBUTTONDOWN==cv2.EVENT_LBUTTONDOWN):
            self.flag=True
            self.startX=x
            self.startY=y
            print('按下左键')
        elif(event&cv2.EVENT_LBUTTONUP==cv2.EVENT_LBUTTONUP):
            self.flag=False
            cv2.rectangle(self.img,pt1=(self.startX,self.startX),pt2=(x,y),color=(0,255,0),thickness=3)
            #构造rect
            self.rect=(min(self.startX,x),min(self.startY,y),abs(self.startX-x),abs(self.startY-y))
            print('弹起左键')
        elif(event&cv2.EVENT_MOUSEMOVE==cv2.EVENT_MOUSEMOVE):
            if self.flag==True:
                #每一次移动都是在最开始的图片中绘制
                self.img=self.img2.copy()
                cv2.rectangle(self.img, pt1=(self.startX, self.startX), pt2=(x, y), color=(0, 255, 0), thickness=3)
            print('鼠标移动')


    def run(self):
        cv2.namedWindow(winname='input',flags=cv2.WINDOW_AUTOSIZE)
        cv2.setMouseCallback('input',self.onmouse)

        self.img=cv2.imread('images/hometomn1.jpg')
        self.img=cv2.resize(src=self.img,dsize=(450,450))
        self.img2=self.img.copy()
        #构造mask
        self.mask=np.zeros(shape=(self.img.shape[0],self.img.shape[1]),dtype=np.uint8)
        self.output=np.zeros(shape=(self.img.shape[0],self.img.shape[1],self.img.shape[2]),dtype=np.uint8)
        while True:
            cv2.imshow('input',self.img)
            cv2.imshow('output',self.output)
            key=cv2.waitKey(100)
            if (key&0xFF==27):
                break

            if key==ord('s'):
                bgmodel=np.zeros((1,65),dtype=np.float64)
                cv2.grabCut(img=self.img2,mask=self.mask,rect=self.rect,bgdModel=bgmodel,
                            fgdModel=bgmodel,iterCount=1,mode=cv2.GC_INIT_WITH_RECT)
            #当判断为前景时,为255,否则为0
            mask2=np.where((self.mask==1)|(self.mask==3),255,0).astype('uint8')
            self.output=cv2.bitwise_and(src1=self.img2,src2=self.img2,mask=mask2)


        cv2.destroyAllWindows()



if __name__ == '__main__':
    print('Pycharm')
    app=App()
    print(app.run())

演示

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-06-25 18:06:59  更:2022-06-25 18:07:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:44:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码