将scipy.ndimage.rotate与Alpha通道一起使用时图像中的伪影

问题描述

旋转具有透明性的图像时出现伪影,但这可能是我应用透明蒙版的方式的错误吗?有谁知道为什么会这样吗?我应该怎么做或如何补救?

我注意到旋转时会发生最坏的情况,但是一旦物体停止角运动,伪影就会保留下来。

我应该一起将遮罩和树旋转成一个阵列吗?

欢迎提出任何建议:)

基本代码

#get mask and sprite
mask_rot = rotate(mask.copy(),degrees,reshape=True,mode='constant',cval=0.0)
sprite_rot = rotate(sprite.copy(),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],:] = (sprite_rot * mask_rot) + (board_slice* (1-mask_rot))

我正在使用此图片(但是任何图片都可能发生)。

enter image description here

问题的一个例子。

enter image description here

解决方法

这可能是由于PNG为32位颜色(具有8位alpha)和GIF仅支持256种颜色和二进制alpha。 alpha通道的旋转会稍微改变边界处的alpha值。因此,通过保存为GIF进行二值化处理后,一些不透明度略低于50%的像素会变得略大于50%不透明。

基本上,PNG图像具有8位alpha,而GIF帧具有二进制alpha。旋转并进行二值化后,alpha通道边界处的一些(部分)透明(即抗锯齿)像素变得不透明,并在下面显示颜色。因此,您需要在旋转之前应用更好的颜色量化工具。请参见基于ImageMagick的http://docs.wand-py.org/en/0.6.2/处的Python Wand,以相同的方式减少颜色。或参见http://effbot.org/imagingbook/image.htm的PIL im.quantize()以减少颜色。

,

对于阅读此书的任何人,我都切换到skimage.transforms.rotate,并且所有功能现在都按预期进行。

它的工作方式与scipy版本非常相似,但到目前为止还没有人工制品。