Ich bekomme Artefakte, wenn ich ein Bild mit Transparenz drehe, aber es könnte der Fehler sein, wie ich die Transparenzmaske anwende? Hat jemand eine Idee, warum es passiert? Was soll ich stattdessen tun oder wie kann ich Abhilfe schaffen?

Ich habe bemerkt, dass es beim Drehen am schlimmsten passiert, aber die Artefakte können bleiben, sobald die Winkelbewegung des Objekts stoppt.

Soll ich die Maske und den Baum zusammen in einem Array drehen?

Anregungen willkommen :)

Grundcode:

#get mask and sprite
mask_rot = rotate(mask.copy(), degrees, reshape=True, mode='constant', cval=0.0)
sprite_rot = rotate(sprite.copy(), degrees, reshape=True, mode='constant', cval=0.0)

#get insertion position
pos = self.centroid

#get array position
x_start = int(round(pos[0] - (sprite_rot.shape[1] / 2)))
y_start = int(round(pos[1] - (sprite_rot.shape[0] / 2)))
x_end = int(x_start + sprite_rot.shape[1])
y_end = int(y_start + sprite_rot.shape[0])

#inset into position

board_slice = self.board.board_copy[y_start:y_start+sprite_rot.shape[0],x_start:x_start+sprite_rot.shape[1],:]

self.board.board_copy[y_start:y_start+sprite_rot.shape[0],x_start:x_start+sprite_rot.shape[1],:] = (sprite_rot * mask_rot) + (board_slice* (1-mask_rot))

Ich benutze dieses Bild (aber es passiert mit jedem).

enter image description here

Ein Beispiel für das Problem.

enter image description here

0
Lewis Morris 31 Aug. 2020 im 17:28

2 Antworten

Beste Antwort

Für alle, die dies lesen, habe ich zu skimage.transforms.rotate gewechselt und alles funktioniert jetzt wie erwartet.

Es funktioniert sehr ähnlich wie die Scipy-Version, aber bisher keine Artefakte.

1
Lewis Morris 1 Sept. 2020 im 19:21

Dies ist wahrscheinlich darauf zurückzuführen, dass das PNG 32-Bit-Farben (mit 8-Bit-Alpha) und GIF nur 256 Farben und binäres Alpha unterstützt. Die Drehung des Alpha-Kanals ändert die Alpha-Werte an der Grenze geringfügig. Einige Pixel, die etwas weniger als 50% undurchsichtig sind, werden beim Binärisieren durch Speichern in GIF etwas mehr als 50% undurchsichtig.

Grundsätzlich hat das PNG-Bild 8-Bit-Alpha und die GIF-Frames haben binäres Alpha. Beim Drehen und Binärisieren werden einige (teilweise) transparente (d. H. Antialiasierte) Pixel an der Grenze des Alphakanals undurchsichtig und zeigen die Farbe darunter. Sie benötigen also ein besseres Farbquantisierungswerkzeug, das vor dem Drehen angewendet wird. Siehe Python Wand unter http://docs.wand-py.org/en/0.6 .2 /, das auf ImageMagick basiert, um Farben auf die gleiche Weise zu reduzieren. Oder sehen Sie PIL im.quantize () unter http://effbot.org/imagingbook/image.htm um Farben zu reduzieren.

1
fmw42 31 Aug. 2020 im 23:22