OpenCV_提取前景区域

目录

  • 前言
  • Matplotlib
    • 安装方法_Pycharm
    • 常用函数——Python
  • GrabCut
    • C++
    • Python
    • 整体代码_Python
    • 结果

前言

GrabCut算法可以提取图像中的前景。
GrabCut包含在Matplotlib库中。
运行起来有点慢,,要有耐心。

Matplotlib

Matplotlib是Python的一个非常重要的绘图库。
注:OpenCV中的图像是以BGR的通道顺序存储的,但Matplotlib是以RGB模式显示的。

安装方法_Pycharm

cmd用pip install Matplotlib。
注:Pycharm可在左下角打开terminal,在终端中输入pip install Matplotlib即可安装。

常用函数——Python

读取图片

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()

GrabCut

C++

函数调用:

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);

Python

函数调用:

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)

整体代码_Python

固定前景区域

#改自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
(哇咔咔咔咔,这个大佬写的超棒哦)

结果

OpenCV_提取前景区域_第1张图片

你可能感兴趣的:(OpenCV)