2016-09-07 2 views
0

Ich habe Probleme beim Speichern meines Bildes nach der Wasserscheide-Segmentierung als Binärbild. Wenn ich die Segmentierung mit cmap = plt.cm.gray auftrage, zeigt es ein Binärbild, aber ich weiß nicht, wie ich das Bild speichern soll (ohne es anzuzeigen).Binärbild nach Wasserscheide speichern

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() 

Antwort

1

Kurz gesagt, können Sie es in ähnlicher Weise speichern, wie Sie es sind, die Anzeige mit (here Referenz sehen):

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

ist jedoch zu beachten, dass segmentation von zwei Etiketten bestehen, Etikett 1 und Etikett 2. Dies liegt daran, den Sie einrichten

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

, die einen Bereich verlässt, wo markers Null ist; Diese Pixel werden nicht als Markierungen behandelt. Das Ergebnis des Laufens watershed ist eine Etikettenmatrix bestehend aus den Marker-Etiketten, in Ihrem Fall 1 und 2. Wenn Sie es mit Ihrem Code anzeigen, sehen Sie ein Binärbild, weil cmap = plt.cm.gray das Bild skaliert. Da das Etikett 0 nicht existiert, skaliert es das Etikett 1 auf den Wert 0 (d. H. Schwarz) und das Etikett 2 auf den Wert 255 (d. H. Weiß) (für Erläuterung und Beispiel siehe here). Das gleiche geschieht, wenn plt.imsave mit cmap = plt.cm.gray verwendet wird. Lange Rede kurzer Sinn, wenn Sie das Bild mit einer anderen Methode/Bibliothek (zB OpenCV) speichern möchten, müssen Sie möglicherweise etwas wie dies zu tun:

segmentation[segmentation == 1] == 0 
segmentation[segmentation == 2] == 255 
segmentation = segmentation.astype(np.uint8) 
# e.g. when writing using OpenCV 
cv2.imwrite('test.png', segmentation) 
+0

Vielen Dank für diese ausführliche Erklärung! Jetzt ist alles klar... – snowflake

Verwandte Themen