GrabCut算法可以提取图像中的前景。
GrabCut包含在Matplotlib库中。
运行起来有点慢,,要有耐心。
Matplotlib是Python的一个非常重要的绘图库。
注:OpenCV中的图像是以BGR的通道顺序存储的,但Matplotlib是以RGB模式显示的。
cmd用pip install Matplotlib。
注:Pycharm可在左下角打开terminal,在终端中输入pip install Matplotlib即可安装。
读取图片
img2 = plt.imread('1.jpg')
显示图片
plt.imshow(img1)
#plt.imshow()函数负责对图像进行处理,并显示其格式,但是不能显示。
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
#此时才能显示出来
创建一个图形(figure)对象
matplotlib.pyplot.figure(num=None, # autoincrement if None, else integer from 1-N
figsize=None, # defaults to rc figure.figsize
dpi=None, # defaults to rc figure.dpi
facecolor=None, # defaults to rc figure.facecolor
edgecolor=None, # defaults to rc figure.edgecolor
frameon=True,
FigureClass=Figure,
clear=False,
**kwargs
)
绘制子图
ax2 = plt.subplot(122, polar=True)#1代表行,2代表列,所以一共有2个图,2代表此时绘制第二个图。polar=True表示绘制极坐标图,其中ax2是为了坐标轴主次刻度大小的设置。
plt.plot(x,y) #x代表角度(弧度制表示),y代表与原点的距离(需为正)。
给子图添加colorbar(颜色条或渐变色条)
plt.colorbar()
函数调用:
void grabCut(InputArray image, InputOutputArray mask, Rect rect, InputOutputArray bgdModel, InputOutputArray fgdModel, int iterCount, int mode)
参数详解如下:
img - 输入图像
mask - 这是一个掩码图像,我们指定哪些区域是背景,前景或可能的背景/前景等。它由以下标志cv2.GC_BGD,cv2.GC_FGD,cv2.GC_PR_BGD,cv2.GC_PR_FGD完成,或者简单地通过0,1,2,3来图像。
rect - 它是一个矩形的坐标,包括格式为(x,y,w,h)的前景对象
bdgModel,fgdModel - 这些是内部算法使用的数组。您只需创建两个大小为(n = 1.65)的np.float64类型零数组。
iterCount - 算法应运行的迭代次数。
mode - 它应该是cv2.GC_INIT_WITH_RECT或cv2.GC_INIT_WITH_MASK或组合,它决定我们是绘制矩形还是最终的触摸笔画。
实际应用:
grabCut(img0, result, selection, bgModel, fgModel, 5, GC_INIT_WITH_RECT);
函数调用:
cv2.grabCut(InputArray image, InputOutputArray mask, Rect rect, InputOutputArray bgdModel, InputOutputArray fgdModel, int iterCount, int mode)
实际应用-----Python:
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount, cv2.GC_INIT_WITH_RECT)
固定前景区域
#改自https://docs.opencv.org/3.0-last-rst/doc/py_tutorials/py_imgproc/py_grabcut/py_grabcut.html?highlight=grabcut
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread("E:/picture/Bai/1.jpg")
cv2.imshow("the whole image",img)
# 创建一个与所加载图像同形状的Mask
mask = np.zeros(img.shape[:2],np.uint8)
# 算法内部使用的数组,你必须创建两个np.float64 类型的0数组,大小是(1, 65)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect = (26, 186, 621, 722)
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask2[:,:,np.newaxis]
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)),plt.colorbar(),plt.show()
鼠标确定前景区域
详见:https://blog.csdn.net/weixin_43194555/article/details/90269082
(哇咔咔咔咔,这个大佬写的超棒哦)