Watershedによる領域分割

V3.0.0
In [2]:
# -*- coding: utf-8 -*-
import cv2
import numpy as np

#Ipythonで表示用の設定
import matplotlib.pyplot as plt
%matplotlib inline

#画像読込
in_img = cv2.imread("coins.jpg")
#表示用にコピー
clone_img = in_img.copy() 

### マーカーの生成 ###
#グレイ画像に変換
gray = cv2.cvtColor(in_img,cv2.COLOR_BGR2GRAY)
#2値化(大津)
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)

# 確実な前景領域(距離画像⇒2値化)
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)

# 背景のラベルを0でなく1にするために、全てのラベルに1を足す
markers = markers + 1

# 不明な領域(unknoun)をラベル0に設定
markers[unknown==255] = 0

### Watershde ###
# 入力:入力画像とマーカ画像
markers = cv2.watershed(in_img, markers)

### 結果の表示 ###
#分水嶺位置を青にする
in_img[markers == -1] = [255,0,0]

#OpenCVがBGRなのでRGBに変換
disp_clone_img = cv2.cvtColor(clone_img,  cv2.COLOR_BGR2RGB)
disp_in_img    = cv2.cvtColor(in_img,  cv2.COLOR_BGR2RGB)

#画像表示
plt.figure(figsize=(12,12))

plt.subplot(331)
plt.imshow(disp_clone_img)
plt.title('Input Image')
plt.subplot(332)
plt.imshow(opening,cmap="gray")
plt.title('binary Image(and openning)')
plt.subplot(333)
plt.title('dist. image(from binary image)')
plt.imshow(dist_transform,cmap="gray")
plt.subplot(334)
plt.title('sure background(sure_bg)')
plt.imshow(sure_bg,cmap="gray")
plt.subplot(335)
plt.title('sure forground(sure_fg)')
plt.imshow(sure_fg,cmap="gray")
plt.subplot(336)
plt.title('unknown (sure_bg - sure_fg)')
plt.imshow(unknown,cmap="gray")
plt.subplot(337)
plt.title('Marker image(afrter segmentation)')
plt.imshow(markers)
plt.subplot(338)
plt.title('result')
plt.imshow(disp_in_img)
Out[2]:
<matplotlib.image.AxesImage at 0xabf2830>

inserted by FC2 system