摘抄个原理先。。
任何一幅灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷。我们向每一个山谷中灌不同颜色的水,随着水的位的升高,不同山谷的水就会相遇汇合,为了防止不同山谷的水汇合,我们需要在水汇合的地方构建起堤坝。不停的灌水,不停的构建堤坝直到所有的山峰都被水淹没。我们构建好的堤坝就是对图像的分割。
-
cv2.watershed
def watershed(image, markers)
算法会根据markers传入的轮廓作为种子,对图像上其他的像素点根据分水岭算法规则进行判断,并对每个像素点的区域归属进行划定,直到处理完图像上所有像素点。而区域与区域之间的分界处的值被置为“-1”,以做区分
对要处理的图像,应用标记,至于标记怎么来,接下来按教科书式步骤 操作下。。。
-
对图像二值化处理,使用Otsu,将图像分为黑白两部分
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('img/qian.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray.copy(), 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
img1 = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
thresh = cv2.cvtColor(thresh,cv2.COLOR_BGR2RGB)
plt.subplot(121), plt.imshow(img1),plt.title('img1'),plt.xticks([]),plt.yticks([])
plt.subplot(122), plt.imshow(thresh),plt.title('thres