これは、インタラクティブな画像セグメンテーションを使用したアプローチです。このアプローチでは、次のように、前景ピクセルの一部と背景ピクセルの一部に手動でラベルを付ける必要があります。
(MS ペイントでラベル付けを行いました。) 以下のコードは、関数 skimage.segmentation.random_walker を使用して画像のセグメンテーションを行い、このセグメント化された画像を生成します。
(このアプローチでは、はるかに複雑な背景領域を持つ画像も処理できます。) コードは次のとおりです。
import skimage
import skimage.viewer
import skimage.segmentation
import skimage.data
import skimage.io
import matplotlib.pyplot as plt
import numpy as np
img = skimage.io.imread("D:/Users/Pictures/img.jpg")
imgLabeled = skimage.io.imread("D:/Users/Pictures/imgLabeled.jpg")
redChannel = imgLabeled[:,:,0]
greenChannel = imgLabeled[:,:,1]
blueChannel = imgLabeled[:,:,2]
markers = np.zeros(img.shape,dtype=np.uint)
markers[(redChannel < 20) & (greenChannel > 210) & (blueChannel < 20)] = 1
markers[(redChannel < 20) & (greenChannel < 20) & (blueChannel > 210)] = 2
plt.imshow(markers)
labels = skimage.segmentation.random_walker(img, markers, beta=1000, mode='cg')
seg1 = np.copy(img)
seg1[labels==2] = 0
seg2 = np.copy(img)
seg2[labels==1] = 0
# plt.imsave("D:/Users/Pictures/imgSeg.png",seg1)
plt.figure()
plt.imshow(seg1)
plt.figure()
plt.imshow(seg2)