其实不要说我不好听啥的,但是我真的很想说,我对某些人你们直接是复制别人的博客来在自己的上面真的有点醉。
你们如果是要给自己看的话,那麻烦你可不可以设置仅自己可见呢?一天到晚的复制别人的博客,真的有点无语,让别人在网上查到的博客全都是千篇一律的,搜了这么久全都是同一篇博客,这样真的很浪费别人的时间啊。你们就少点为互联网复制冗余数据了好吧??
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就是得到提取目标的图,每个目标保存为一个图片