如何迭代旋转图像局部区域并合并所有旋转后的区域?
问题描述
目标
我想要旋转图像的蒙版区域。例如,若有一个内半径30、外半径50的圆形蒙版,我希望将蒙版区域旋转一定角度后叠加到原图上。但我需要使用不断缩小的圆形蒙版,并对应不同的旋转角度——比如要实现图像中心扭曲效果,就需要让半径越小的圆形区域旋转角度越大。
现有代码
from PIL import Image, ImageDraw, ImageFilter import numpy im1 = Image.open('lena.jpg') im2 = Image.open('lena.jpg').resize(im1.size) # Giving The Original image Directory # Specified Original_Image = Image.open('lena.jpg') # This Will Rotate Image By 60 Degree for i in numpy.arange(0,10,0.5): mask = Image.new("L", im1.size, 0) draw = ImageDraw.Draw(mask) rotated_image3 = Original_Image.rotate(18*i) draw.ellipse((144+i-5, 54+i-5, 256-i+5, 166-i+5), fill=255) draw.ellipse((140+i, 50+i, 260-i, 170-i), fill=0) im = Image.composite(rotated_image3, im2, mask) im.show()
遇到的问题
运行上述代码后,图像仅显示最后一个旋转区域。我该如何修改代码,将迭代过程中所有选中区域的旋转效果合并到同一张图像中?
解决方案
问题核心是每次循环都基于原始图像im2做合成,导致前一次的旋转效果被覆盖,只保留最后一次结果。要叠加所有效果,需要把每次合成后的图像作为下一次合成的基础。
修改后的代码:
from PIL import Image, ImageDraw import numpy # 仅加载一次原图,避免重复IO操作 Original_Image = Image.open('lena.jpg') # 初始化结果图像为原图副本,后续所有修改都基于此 result_im = Original_Image.copy() for i in numpy.arange(0, 10, 0.5): mask = Image.new("L", Original_Image.size, 0) draw = ImageDraw.Draw(mask) # 生成对应旋转角度的图像 rotated_image = Original_Image.rotate(18 * i) # 绘制环形蒙版:外层填充白色,内层挖空 draw.ellipse((144+i-5, 54+i-5, 256-i+5, 166-i+5), fill=255) draw.ellipse((140+i, 50+i, 260-i, 170-i), fill=0) # 关键:用当前结果图像作为合成背景,叠加新的旋转效果 result_im = Image.composite(rotated_image, result_im, mask) result_im.show()
修改说明
- 复用结果图像:将
result_im初始化为原图副本,每次合成后更新它,确保所有旋转效果依次叠加。 - 优化资源加载:只打开一次原图,提升运行效率。
- 保留原有蒙版逻辑:蒙版绘制方式不变,仅调整合成的目标图像,保证效果符合预期。
内容的提问来源于stack exchange,提问作者user22785665
相关产品推荐
相关产品推荐

