opencv grabcut函数初使用:多目标图像提取

本文深入探讨了GrabCut算法的原理与应用,通过实例演示如何使用OpenCV实现图像分割,特别关注多目标检测与分割的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实不要说我不好听啥的,但是我真的很想说,我对某些人你们直接是复制别人的博客来在自己的上面真的有点醉。

你们如果是要给自己看的话,那麻烦你可不可以设置仅自己可见呢?一天到晚的复制别人的博客,真的有点无语,让别人在网上查到的博客全都是千篇一律的,搜了这么久全都是同一篇博客,这样真的很浪费别人的时间啊。你们就少点为互联网复制冗余数据了好吧??

 

import cv2 as cv
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

img_path = "/home/vr/Desktop/grabcut/1920_3840.jpg"

img = cv2.imread(img_path)
mask = np.zeros(img.shape[:2],np.uint8)
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)

rect=((191,162,324-191,299-162),(284,110,425-284,217-110),(58,2,392-58,239-2)) #

orin = img
count = 0

for each in rect:
    print each
    img = orin
    cv2.grabCut(img,mask,each,bgdModel,fgdModel,10,cv2.GC_INIT_WITH_RECT)
    mask2 = np.where((mask==0)|(mask==2),0,1).astype('uint8')

    img = img*mask2[:,:,np.newaxis]

    # cv2.imshow('p',img)
    # cv2.waitKey(1000)
    image = Image.fromarray(img)
    image.show()
    count = count + 1
    cv2.imwrite("/home/vr/Desktop/"+str(count)+".jpg",np.array(image))
    plt.imshow(np.array(image))
    plt.show()
# plt.show()

 

首先呢,前面都没什么好说得了。

mask.zero就是开始全部归零,这个就是当做背景的mask

至于fgdmask,bgdmask为什么是这样设置的我现在还是没有搞懂。但是至少我随意换了其他值,程序运行会报错

来看看CV2.grabcut函数

你们可以看到我在这里为什么会遍历一个rect呢?

因为grabcut函数每次只能处理一个矩形框,而每个矩形框里面当然只有一个检测到的目标啦。所以当一个图片里面是有多个目标的时候,就需要用这样的方法来进行多目标的检测的分割

对于grabcut函数来说,0为背景,1为前景,2为可能是背景,3为可能是前景

这里看看mask2,是把0/2全部归类为背景,其他归类为前景。这样的效果过比较好

最后就是得到img×mask2就是得到提取目标的图,每个目标保存为一个图片

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值