Сохранить бинарное изображение после водораздела

У меня проблемы с сохранением моего изображения после сегментации водораздела в виде двоичного изображения. Когда я строю сегментацию с помощью 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()

person honeymoon    schedule 07.09.2016    source источник


Ответы (1)


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

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 (т.е. белый) (см. здесь для объяснения и примера). То же самое делается при использовании 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)
person David Stutz    schedule 07.09.2016