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)

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

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

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