2016-09-07 12 views
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() 

ответ

1

Короче говоря, вы можете сохранить его аналогично тому, как вы показываете его с помощью (см here для справки):

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

Однако обратите внимание, что segmentation будет состоять из двух этикеток, этикеток 1 и ярлык 2. Это происходит потому, что вы настраиваете

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

, который оставляет область, где markers равен нулю; эти пиксели не рассматриваются как метки. Результатом работы watershed является матрица меток, состоящая из маркерных меток, в вашем случае 1 и 2. При отображении его с помощью кода вы увидите двоичное изображение, потому что cmap = plt.cm.gray будет масштабировать изображение. Поскольку метки 0 не существует, она будет масштабировать метку 1 до значения 0 (т. Е. Черный) и метку 2 для значения 255 (то есть белого) (см. here для пояснения и примера). То же самое делается при использовании 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) 
+0

Спасибо большое за подробное объяснение! Теперь все ясно... – snowflake