【OpenCV图像处理14】图像分割与修复(下)

简介: 【OpenCV图像处理14】图像分割与修复(下)

3、调用GrabCut实现图像分割

grabCut()用法:

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

参数说明:

  • mask:生成的掩码
  • BGD:背景,0
  • FGD:前景,1
  • PR_BGD:可能是背景,2
  • PR_FGD:可能是前景,3
  • bgdModel, fgdModel:np.float64 type zero arrays of size(1, 65)
  • mode:模式
  • GC_INIT_WITH_RECT:指定某个区域,即在该区域中找前景
  • GC_INIT_WITH_MASK:如果是第二次或第三次,可使用该参数再次迭代

代码实现(完整代码):

import cv2
import numpy as np
class App:
    flag_rect = False
    rect = (0, 0, 0, 0)
    startX = 0
    startY = 0
    def onmouse(self, event, x, y, flags, param):
        if event == cv2.EVENT_LBUTTONDOWN:
            self.flag_rect = True
            self.startX = x
            self.startY = y
            print('LBUTTONDOWN: 左键按下')
        elif event == cv2.EVENT_LBUTTONUP:
            self.flag_rect = False
            cv2.rectangle(self.img, (self.startX, self.startY), (x, y), (0, 0, 255), 3)
            self.rect = (min(self.startX, x), min(self.startY, y), abs(self.startX - x), abs(self.startY - y))
            print('LBUTTONUP: 左键抬起')
        elif event == cv2.EVENT_MOUSEMOVE:
            if self.flag_rect == True:
                self.img = self.img2.copy()
                cv2.rectangle(self.img, (self.startX, self.startY), (x, y), (0, 255, 0), 3)
            print('MOUSEMOVE: 鼠标移动')
        print('onmouse')
    def run(self):
        print('run')
        cv2.namedWindow('input')
        cv2.setMouseCallback('input', self.onmouse)
        self.img = cv2.imread('../resource/lena.bmp')
        self.img2 = self.img.copy()
        self.mask = np.zeros(self.img.shape[:2], dtype=np.uint8)
        self.output = np.zeros(self.img.shape, np.uint8)
        while (1):
            cv2.imshow('input', self.img)
            cv2.imshow('output', self.output)
            key = cv2.waitKey(100)
            if key == 27:
                break
            if key == ord('g'):
                bgdModel = np.zeros((1, 65), np.float64)
                fgdModel = np.zeros((1, 65), np.float64)
                cv2.grabCut(self.img2, self.mask, self.rect, bgdModel, fgdModel, 1, cv2.GC_INIT_WITH_RECT)
            mask2 = np.where(((self.mask == 1) | (self.mask == 3)), 255, 0).astype('uint8')
            self.output = cv2.bitwise_and(self.img2, self.img2, mask=mask2)
App().run()

1.3 MeanShift法

严格来说,该方法并不是用来对图像分割的,而是在色彩层面的平滑滤波。

它会中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的颜色区域。以图像上任一点p为圆心,半径为sp,色彩幅值为sr进行不断的迭代。

pyrMeanShiftFiltering()用法:

cv2.pyrMeanShiftFiltering(src, sp, sr, dst: None, maxLevel: None, termcrit: None)

参数说明:

  • sp:圆的半径
  • sp:色彩幅值

代码实现:

import cv2
img = cv2.imread('../resource/flower.png')
img_mean = cv2.pyrMeanShiftFiltering(img, 20, 30)
img_canny = cv2.Canny(img_mean, 150, 300)
contours, _ = cv2.findContours(img_canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
cv2.imshow('img', img)
cv2.imshow('img_mean', img_mean)
cv2.imshow('img_canny', img_canny)
cv2.waitKey(0)
cv2.destroyAllWindows()

2、视频前后景分离(视频背景抠图)

原视频:

原理:

  • 视频是一组连续的帧(一幅幅图组成)
  • 帧与帧之间关系密切(GOP)
  • 在GOP中,背景几乎是不变的

MOG去背景: 混合高斯模型为基础的前景/背景分割算法

createBackgroundSubtractorMOG()用法:

cv2.bgsegm.createBackgroundSubtractorMOG(history: None, nmixtures: None, backgroundRatio: None, noiseSigma: None)

参数说明:

  • history:参考帧,默认 200
  • nmixtures:高斯范围值,默认 5
  • backgroundRatio:背景比率,默认 0.7
  • noiseSigma:自动降噪,默认 0

代码实现:

import cv2
cap = cv2.VideoCapture('../resource/Car.mp4')
mog = cv2.bgsegm.createBackgroundSubtractorMOG()
while (True):
    ret, frame = cap.read()
    fgmask = mog.apply(frame)
    cv2.imshow('img', fgmask)
    key = cv2.waitKey(10)
    if key == 27:
        break
cap.release()
cv2.destroyAllWindows()

3.1 MOG2去背景

同MOG类似,不过对亮度产生的阴影有更好的识别.

createBackgroundSubtractorMOG2()用法:

cv2.createBackgroundSubtractorMOG2(history: None, varThreshold: None, detectShadows: None)

参数说明:

  • history:参数帧,默认 500
  • detectShadows:是否检测阴影,默认 True

代码实现:

import cv2
cap = cv2.VideoCapture('../resource/Car.mp4')
# 优点: 可以计算出阴影部分
# 缺点: 会产生很多噪点
mog2 = cv2.createBackgroundSubtractorMOG2()
while (True):
    ret, frame = cap.read()
    fgmask = mog2.apply(frame)
    cv2.imshow('img', fgmask)
    key = cv2.waitKey(10)
    if key == 27:
        break
cap.release()
cv2.destroyAllWindows()

3.2 GMG去背景

静态背景图像估计和每个像素的贝叶斯分割,抗噪性更强。

createBackgroundSubtractorGMG()用法:

cv2.bgsegm.createBackgroundSubtractorGMG(initializationFrames: None, decisionThreshold: None)

参数说明:

  • initializationFrames:初始帧数,默认 120

代码实现:

import cv2
cap = cv2.VideoCapture('../resource/Car.mp4')
# 优点: 可以算出阴影部分,同时减少了噪点
# 缺点: 如果采用默认值,则在开始会有很长时间不显示
gmg = cv2.bgsegm.createBackgroundSubtractorGMG(initializationFrames=10)
# 解决办法: 调整初始参考帧的数量
while (True):
    ret, frame = cap.read()
    fgmask = gmg.apply(frame)
    cv2.imshow('img', fgmask)
    key = cv2.waitKey(10)
    if key == 27:
        break
cap.release()
cv2.destroyAllWindows()

3、图像修复

图像修复效果:

inpaint()用法:

cv2.inpaint(src, inpaintMask, inpaintRadius, flags, dst: None)

参数说明:

  • inpaintMask:修复掩码
  • inpaintRadius:每个点的圆形领域半径
  • flags:
  • INPAINT_NS
  • INPAINT_TELEA
  • dst:输出与src具有相同大小和类型的图像

代码实现:

import cv2
import numpy as np
img = cv2.imread('../resource/cvLogo_Ori.png')
mask = cv2.imread('../resource/cvLogo_Mask.png', 0)
dst = cv2.inpaint(img, mask, 5, cv2.INPAINT_TELEA)
cv2.imshow('img', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

目录
相关文章
|
2月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
104 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
1月前
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
68 2
|
3月前
|
计算机视觉 C++
基于VS2019和Opencv4,对hsv颜色空间的图像分割原理以及实现
这篇文章介绍了基于HSV颜色空间的图像分割原理,包括HSV模型的基本概念和如何在OpenCV中通过设置HSV的色彩范围来实现图像中特定颜色的物体分割,并通过示例代码展示了在静态图像和视频流中进行颜色分割的方法。
基于VS2019和Opencv4,对hsv颜色空间的图像分割原理以及实现
WK
|
3月前
|
计算机视觉 Python
如何使用OpenCV进行基本图像处理
使用OpenCV进行基本图像处理包括安装OpenCV,读取与显示图像,转换图像颜色空间(如从BGR到RGB),调整图像大小,裁剪特定区域,旋转图像,以及应用图像滤镜如高斯模糊等效果。这些基础操作是进行更复杂图像处理任务的前提。OpenCV还支持特征检测、图像分割及对象识别等高级功能。
WK
49 4
|
6月前
|
人工智能 计算机视觉 Python
【OpenCV】计算机视觉图像处理基础知识(上)
【OpenCV】计算机视觉图像处理基础知识(上)
|
6月前
|
算法 计算机视觉
【OpenCV】计算机视觉图像处理基础知识(下)
【OpenCV】计算机视觉图像处理基础知识(下)
|
6月前
|
算法 安全 机器人
最新版opencv4.9安装介绍,基本图像处理详解
最新版opencv4.9安装介绍,基本图像处理详解
305 0
|
6月前
|
机器学习/深度学习 存储 算法
OpenCV与NumPy:图像处理中的黄金组合
【4月更文挑战第17天】OpenCV和NumPy是Python图像处理的两大利器,互补协作形成黄金组合。OpenCV专注计算机视觉,提供丰富算法,而NumPy擅长数值计算和数组操作。两者无缝对接,共同实现高效、灵活的图像处理任务。通过灰度化、二值化、边缘检测等案例,展示了它们的协同作用。未来,这一组合将在计算机视觉和机器学习领域发挥更大作用,解锁更多图像处理潜力。
|
1月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
328 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
2月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
49 4