2

独自の領域内のエッジの外側と内側のピクセルを抽出しようとしていますが、現在、次のように scipy Sobel フィルターを適用しています。

im = scipy.misc.imread(filename)
im = im.astype('int32')
dx = ndimage.sobel(im, axis=0)
dy = ndimage.sobel(im, axis=1)

mag = np.hypot(dx, dy)  
mag *= 255.0 / np.max(mag)

scipy.misc.imsave('sobel.jpg', mag)

現在、結果は次のとおりです。

ここに画像の説明を入力 ここに画像の説明を入力

アイデアは、エッジ検出の外側のピクセルを取得することです。たとえば、次の領域です。

ここに画像の説明を入力

sobel フィルターの外側と内側の領域の配列を抽出するにはどうすればよいですか?

4

1 に答える 1

1

これは、インタラクティブな画像セグメンテーションを使用したアプローチです。このアプローチでは、次のように、前景ピクセルの一部と背景ピクセルの一部に手動でラベルを付ける必要があります。

ラベル付き画像

(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)
于 2016-12-16T10:20:12.203 に答える