Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,開發環境為PyCharm
17.3 分水嶺算法圖像分割執行個體
本節結合前面介紹的知識,講解一個圖像分割執行個體。使用分水嶺算法進行圖像分割時,基本的步驟為:
1.通過形态學開運算對原始圖像O去噪。
2.通過腐蝕操作擷取“确定背景B”。需要注意,這裡得到“原始圖像-确定背景”即可。
3.利用距離變換函數cv2.distanceTransform()對原始圖像進行運算,并對其進行門檻值處理,得到“确定前景F”。
4.計算未知區域UN(UN=O -B - F)。
5.利用函數cv2.connectedComponents()對原始圖像O進行标注。
6.對函數cv2.connectedComponents()的标注結果進行修正。
7.使用分水嶺函數完成對圖像的分割。
eg1:使用分水嶺算法對一幅圖像進行分割,并觀察分割的效果。
代碼如下:
import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('water_coins.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
ishow=img.copy()
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)
sure_bg = cv2.dilate(opening,kernel,iterations=3)
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)
ret, markers = cv2.connectedComponents(sure_fg)
markers = markers+1
markers[unknown==255] = 0
markers = cv2.watershed(img,markers)
img[markers == -1] = [0,255,0]
plt.subplot(121)
plt.imshow(ishow)
plt.axis('off')
plt.subplot(122)
plt.imshow(img)
plt.axis('off')
plt.show()
運作上述程式,得到的結果如下圖所示。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL3lEVPVTWE1keRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0YDN2ITN1kDM2EjMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)