如何使用skimage移除图像旋转操作后产生的灰色边框
问题原因
skimage.transform.rotate 出现灰色边框是两个默认参数共同导致的:
- 默认边缘填充值为0(黑色),旋转时边缘像素会和黑色做线性插值,生成半透明的灰边像素
- 默认开启线性插值,边缘过渡时会生成介于原图像素和填充色之间的中间值,叠在白色背景上就呈现为灰色边框
解决代码
你可以修改rotate的参数关闭边缘插值影响,同时保留skimage旋转的平滑效果,修改后的完整代码如下:
from skimage import transform from skimage.io import imread, imsave from PIL import Image # white background bg = Image.new('RGB', (557, 558), (255, 255, 255)) bg = bg.convert('RGBA') # yellow image y = Image.new('RGB', (557, 558), (254, 255, 14)) y = y.convert('RGBA') y.save('yellow.png') # 调整rotate参数消除灰边 y = imread('yellow.png') # 核心参数说明: # cval:设置边缘填充值,RGBA图填充全透明的(0,0,0,0),避免和黑色插值出灰边 # preserve_range:保留原始0-255像素值范围,避免默认归一化到0-1导致存储异常 # resize:如果需要保留旋转后完整图像不被裁剪,可以设为True,不需要就保持默认False rotate = transform.rotate(y, 20, cval=(0,0,0,0), preserve_range=True) imsave('rotated.png', rotate.astype('uint8')) # read rotated image in Pillow rt = Image.open('rotated.png') # superimpose yellow image on white background com1 = Image.alpha_composite(bg, rt).convert('RGB') com1.show()
额外说明
如果对边缘过渡平滑度要求不高,也可以在rotate参数中添加order=0使用最近邻插值,完全消除过渡像素,但图像边缘会有锯齿,效果和Pillow旋转接近。
内容的提问来源于stack exchange,提问作者J Lo
相关产品推荐
相关产品推荐

