Ausgabe
Ich habe einige Bilder vom Boden eines Obstgartens, die so aussehen:
Jetzt möchte ich eine Kastanienregion extrahieren image1.png
und sie dann anziehen image2.png
.
Also habe ich mit Adobe Photoshop ein Maskenbild erstellt, und das Ergebnis (als exportiert mask.png
) sieht so aus:
Sie können sehen, dass der ausgewählte Bereich eng an den Rand der Kastanie angepasst ist.
Als ich jedoch das exportierte Maskenbild mit Python las, passte die ausgewählte Region nicht mehr zum Rand. Es war ein Rechteck, das so aussah:
Dies ist, was ich getan habe, als ich die Bilder gelesen und generiert habe result.png
.
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
# read image1.png
image1 = np.array(Image.open('image1.png').convert('RGB'))
# read mask.png
mask = np.array(Image.open('mask.png').convert('RGB'))
# Boolean indices representing the selected region
region = np.all(img != 255, axis=-1)
# "region" has a shape of (height, width)
# so we have to add an axis corresponding to color channels
region = np.dstack([region, region, region])
plt.imshow(np.where(region, image1, 255))
plt.axis('off')
plt.savefig('result.png', bbox_inches='tight')
Gibt es ein Tool, mit dem ich das Maskenbild so verwenden kann, wie es ist (nicht wie result.png
, sondern wie mask.png
)?
Lösung
Sie können OpenCV Python ausprobieren. Technisch gesehen ist Ihr mask.png
Bild ein RGBA-Farbbild, wobei RGB für Rot-Grün-Blau und A für Transparenz steht. Wenn Sie verwendet np.array(Image.open('mask.png').convert('RGB'))
haben, haben Sie den Transparenzkanal aus dem Bild entfernt.
import numpy as np
import cv2
import matplotlib.pyplot as plt
mask = cv2.imread('mask.png', cv2.IMREAD_UNCHANGED)
cv2.imwrite('result.png',mask)
Beantwortet von – manaclan
Antwort geprüft von – Clifford M. (FixError Volunteer)