opencv--python学习记录(十)

一、图像分割

1、图像分割的定义及方法

        将前景物体从背景中分离出来

        方法:之前讲过的二值化,轮廓,腐蚀膨胀都可以用在图像分割;所以大致分为两种:传统图像分割方法和基于深度学习的图像分割方法;

二、传统图像分割方法

1、分水岭法

 

         实际操作:

 API: watershed( img,  masker)

        masker前景、背景设置不同的值用以区分它们;

 

import cv2
import numpy as np
from matplotlib import pyplot as pl

#获取背景
#1.通过二值法得到黑白图片
#2.通过形态学获取背景

img = cv2.imread("F:\\tupian\\water_coins.jpeg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 0, 255, 
                            cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

#开运算
kernel = np.ones((3,3),np.int8)
open1 = cv2.morphologyEx(thresh,cv2.MORPH_OPEN, kernel, iterations=2)

#膨胀
bg = cv2.dilate(open1, kernel, iterations=1)

#获取前景物体
dist = cv2.distanceTransform(open1, cv2.DIST_L2, 5)

ret, fg = cv2.threshold(dist, 0.7*dist.max(), 255, 0)

# pl.imshow(dist, cmap='gray')
# pl.show()
# exit()



#获取位置区域
fg = np.uint8(fg)
unknow = cv2.subtract(bg, fg)

#创建连通域
ret, marker = cv2.connectedComponents(fg)

marker = marker + 1
marker[unknow==255] = 0

#进行图像分割
result = cv2.watershed(img, marker)

img[result == -1] = [0,0,255]

cv2.imshow('img',img)

cv2.imshow('fg',fg)


cv2.imshow('unknow',unknow)
cv2.imshow('bg',bg)
cv2.waitKey(0)

2、GrabCut法

        通过交互的方式获得前景物体;

 

 

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("LBUTTIONDOWN")
        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("LBUTTIONUP")
        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),
                                (255, 0, 0), 
                                3)
            print("MOUSEMOVE")  

        print("onmouse")

    def run(self):
        print("run...")

        cv2.namedWindow('input')
        cv2.setMouseCallback('input', self.onmouse)

        self.img = cv2.imread("F:\\tupian\\lena.png")
        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)
            k = cv2.waitKey(100)
            if k == 27:
                break

            if k == 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()

 

 3、MeanShift原理

 

import cv2
import numpy as np

img = cv2.imread("F:\\tupian\\key.png")

mean_img = cv2.pyrMeanShiftFiltering(img, 20, 30)

imgcanny = cv2.Canny(mean_img, 150, 300)

contours, _ = cv2.findContours(imgcanny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

cv2.drawContours(img, contours, -1, (0, 0, 255), 2)

cv2.imshow('img', img)
cv2.imshow('mean_img', mean_img)
cv2.imshow('canny', imgcanny)
cv2.waitKey()

三、背景扣除

1、视频前后景分离

        

import cv2
import numpy as np

cap = cv2.VideoCapture('F:\\tupian\\vtest.avi')
mog = cv2.bgsegm.createBackgroundSubtractorMOG()

while(True):
    ret, frame = cap.read()
    fgmask = mog.apply(frame)

    cv2.imshow('img', fgmask)

    k = cv2.waitKey(10)
    if(k == 27):
        break

cap.release()
cv2.destroyAllWindows()

   2、其他视频前后景分离

import cv2
import numpy as np

cap = cv2.VideoCapture('F:\\tupian\\vtest.avi')
#好处:可以计算出阴影部分
#缺点:会产生很多噪点
mog = cv2.createBackgroundSubtractorMOG2()

while(True):
    ret, frame = cap.read()
    fgmask = mog.apply(frame)

    cv2.imshow('img', fgmask)

    k = cv2.waitKey(10)
    if(k == 27):
        break

cap.release()
cv2.destroyAllWindows()

 

 

 

import cv2
import numpy as np

cap = cv2.VideoCapture('F:\\tupian\\vtest.avi')
#好处:可以计算出阴影部分,同时减少噪点
#缺点:如果采用默认值则开始很长时间没有画面
mog = cv2.bgsegm.createBackgroundSubtractorGMG(10)

while(True):
    ret, frame = cap.read()
    fgmask = mog.apply(frame)

    cv2.imshow('img', fgmask)

    k = cv2.waitKey(10)
    if(k == 27):
        break

cap.release()
cv2.destroyAllWindows()

四、图像修复

 

 

import cv2
import numpy as np

img = cv2.imread("F:\\tupian\\inpaint.png")
mask = cv2.imread("f:\\tupian\\inpaint_mask.png", 0)

dst = cv2.inpaint(img, mask, 5, cv2.INPAINT_TELEA)


cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值