分水岭后保存二进制图像

时间:2016-09-07 10:40:17

标签: python image-segmentation watershed scikit-image

我在分水岭分割后将图像存储为二进制图像时出现问题。当我使用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 个答案:

答案 0 :(得分:1)

简而言之,您可以使用它来保存它(与here一样参考):

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

但请注意,segmentation将包含两个标签,标签1和标签2。这是因为你正在设置

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

留下markers为零的区域;这些像素不被视为标记。运行watershed的结果是一个标签矩阵,由您的案例12组成。使用您的代码显示它时,您将看到二进制图像,因为cmap = plt.cm.gray将缩放图像。由于标签0不存在,它会将标签1缩放为值0(即黑色),并将2标记为值255(即白色) (有关解释和示例,请参阅here)。将plt.imsavecmap = 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)