Ich möchte das Teilbild erhalten, das aus dem Ausschneiden eines Polygons in einem Bild resultiert.Bildsegment aus Polygon extrahieren, mit skimage
Ich habe ein Bild in skimage, und ich habe ein Polygon in matplotlib.patches.
Wie geht das?
Unten ist, was ich versucht habe. Ich suche nicht unbedingt nach einem ähnlichen Weg, ich suche nach der saubersten und effizientesten Implementierung.
Mit diesem Code überlagert das Polygon richtig den Teil des Bildes I extrahiert werden soll (aber das Segment von Interesse nicht extrahieren):
import numpy as np
import skimage.io as io
import matplotlib.pyplot as plt
from matplotlib.collections import PatchCollection
from matplotlib.patches import Polygon
I = io.imread(fp) # fp is path to image
plt.imshow(I)
ax = plt.gca()
polygons, color = [], []
c = np.random.random((1, 3)).tolist()[0]
for seg in ann['segmentation']:
poly = np.array(seg).reshape((len(seg)/2, 2))
polygons.append(Polygon(poly, True,alpha=0.4))
color.append(c)
p = PatchCollection(polygons, facecolors=color, edgecolors=(0,0,0,1), linewidths=3, alpha=0.4)
ax.add_collection(p)
Aber wenn Ich versuche, das segmentierte Bild mit diesem Code zu erhalten, das Overlay zeigt falsch an:
fig, ax = plt.subplots()
im = ax.imshow(I)
im.set_clip_path(polygon)
plt.axis('off')
plt.show()
Es sieht aus wie die Y des Polygons müssen Koordinaten nur gespiegelt (vor allem, da das obere Bild zeigt Y-Achse umgekehrt zu bestellen), aber das ist nicht der Fall:
a = polygons[0].xy.copy()
a[:,1] = im._A.shape[0] - a[:,1]
newPoly = Polygon(a, True,alpha=0.4)
fig, ax = plt.subplots()
im = ax.imshow(I)
im.set_clip_path(newPoly)
plt.axis('off')
plt.show()
(Tatsächlich gibt es nicht nur ein Offset-Problem in X-Koordinaten, es gibt sogar ein Skalierungsproblem in Y-Koordinaten. Ich habe keine Ahnung warum)
Was ist Ann in der Schleife? für SEG in ann [ 'Segmentierungs']: poly = np.array (SEG) .reshape ((len (seg)/2, 2)) polygons.append (Polygon (poly, True, alpha = 0,4)) color.append (c) –