图像分割
什么是图像分割?
图像分割的方法?
传统的图像分割方法
- 分水岭法
- 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
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)
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('bg', bg)
cv.imshow('fg', fg)
cv.waitKey(0)