opencv图像的分割-分水岭法

图像分割

什么是图像分割?

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

图像分割的方法?

  • 传统的图像分割方法
  • 基于深度学习的图像分割方法

传统的图像分割方法

  • 分水岭法
  • GrabCut法
  • MeanShift法
  • 背景扣除

分水岭法原理

在这里插入图片描述

分水岭法的问题

在这里插入图片描述

分水岭法处理的步骤

  • 标记背景
  • 标记前景
  • 标记未知区域
  • 进行分割

分割硬币

在这里插入图片描述

分水岭法的API

  • watershed(img,masker)
  • masker,前景,背景设置不同的值用以区分它们

距离变换的API

  • distanceTransform(img, distanceType, maskSize)
  • distanceType:DIST_L1,DIST_L2
  • maskSize:L1用3,L2用5

求连通域

  • connectComponents(img,connectivity,…)
  • connectivity: 4,8 (默认)
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 获取背景
# 1. 通过二值法得到黑白图片
# 2. 通过形态学获取背景

img = cv.imread(r'C:\Users\Administrator\Desktop\coins.png')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

ret, thresh = cv.threshold(gray, 100, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)
# 开运算,去除噪点
kernel = np.ones((3, 3), np.int8)
open1 = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel, iterations=2)

# 膨胀运算
bg = cv.dilate(open1, kernel, iterations=1)

##############################################################################
# 获取前景
dst = cv.distanceTransform(open1, cv.DIST_L2, 5)
ret2, fg = cv.threshold(dst, 0.7*dst.max(), 255, cv.THRESH_BINARY)
###############################################################################
# 获取未知区域
fgg = np.uint8(fg)
unknow = cv.subtract(bg, fgg)
cv.imshow('unknow', unknow)
################################################################################
# maker创建连通域
ret, maker = cv.connectedComponents(fgg)
maker = maker + 1
maker[unknow == 255] = 0
############################################################################
# 图像分割
result = cv.watershed(img, maker)
img[result == -1] = [0, 0, 255]
#########################################################################

cv.imshow('img', img)
# cv.imshow('thresh', thresh)
cv.imshow('bg', bg)
# cv.imshow('dst', dst)
cv.imshow('fg', fg)
# plt.imshow(dst, cmap='gray')
# plt.show()
cv.waitKey(0)

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值