0

流域セグメンテーション後の画像をバイナリ画像として保存する際に問題があります。cmap=plt.cm.gray を使用してセグメンテーションをプロットすると、バイナリ イメージが表示されますが、イメージを保存する方法がわかりません (表示せずに)。

import cv2
import numpy as np
from matplotlib import pyplot as plt
from skimage.morphology import watershed
from scipy import ndimage as ndi
from skimage import morphology
from skimage.filters import sobel
from skimage.io import imread, imsave, imshow
import scipy.misc

img = cv2.imread('07.png')
img = cv2.medianBlur(img,5)
b,g,r = cv2.split(img)

elevation_map = sobel(r)
markers = np.zeros_like(r)
markers[s < 140] = 1
markers[s > 200] = 2
segmentation = morphology.watershed(elevation_map, markers)

fig, ax = plt.subplots(figsize=(4, 3))
ax.imshow(segmentation, cmap=plt.cm.gray, interpolation='nearest')
ax.axis('off')
plt.show()
4

1 に答える 1

1

つまり、次を使用して表示する方法と同様に保存できます (参照については、こちらを参照してください)。

plt.imsave('test.png', segmentation, cmap = plt.cm.gray)

ただし、これは labelと labelsegmentationの 2 つのラベルで構成されることに注意してください。これはあなたが設定しているためです12

markers[s < 140] = 1
markers[s > 200] = 2

markersがゼロの領域を残します。これらのピクセルはマークとして扱われません。実行の結果はwatershed、マーカー ラベルで構成されるラベル マトリックス1です2。コードを使用して表示するとcmap = plt.cm.gray、画像がスケーリングされるため、バイナリ画像が表示されます。ラベル0が存在しないため、ラベル1を値0(つまり黒) に、ラベル2を値255(つまり白)にスケーリングします (説明と例については、こちらを参照してください)。で使用plt.imsaveする場合も同様ですcmap = plt.cm.gray。簡単に言えば、他の方法/ライブラリ (OpenCV など) を使用して画像を保存する場合は、次のような操作が必要になる場合があります。

segmentation[segmentation == 1] == 0
segmentation[segmentation == 2] == 255
segmentation = segmentation.astype(np.uint8)
# e.g. when writing using OpenCV
cv2.imwrite('test.png', segmentation)
于 2016-09-07T13:20:07.217 に答える