分水岭后保存二值图像

Save binary image after watershed

我在将分水岭分割后的图像存储为二值图像时遇到问题。当我用 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()

简而言之,您可以像显示它一样保存它(参考 ):

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 时也是如此。长话短说,如果你想使用任何其他 method/library(例如 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)