我在分水岭分割后将图像存储为二进制图像时出现问题。当我使用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()
答案 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
的结果是一个标签矩阵,由您的案例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)