如何通过圆形裁剪Matplotlib图像?能否仅用Matplotlib实现?
仅用Matplotlib实现图像圆形裁剪的解决方案
你的代码报错是因为将浮点型的单通道数据(Z)与uint8类型的alpha通道堆叠后,形成了(10,10,2)的float数组,PIL不支持这种非标准的图像格式,因此抛出类型错误。
以下是两种仅依赖Matplotlib的圆形裁剪实现方式:
方法一:通过alpha蒙版实现圆形透明裁剪
生成圆形蒙版数组,在imshow时传入alpha参数,让圆形外的区域透明:
import matplotlib.pyplot as plt import numpy as np np.random.seed(100) Z = np.random.rand(10, 10) fig, ax = plt.subplots() # 生成圆形蒙版 h, w = Z.shape y, x = np.mgrid[:h, :w] center_y, center_x = h//2, w//2 radius = min(h, w) // 2 # 计算每个像素到中心的距离,筛选出圆形区域内的像素 mask = ((x - center_x)**2 + (y - center_y)**2) <= radius**2 # 绘制图像并应用蒙版 ax.imshow(Z, alpha=mask.astype(float)) plt.show()
方法二:通过clip_path实现物理裁剪
创建圆形补丁作为裁剪路径,让图像仅显示圆形区域内的内容:
import matplotlib.pyplot as plt import numpy as np from matplotlib.patches import Circle np.random.seed(100) Z = np.random.rand(10, 10) fig, ax = plt.subplots() # 绘制原始图像 im = ax.imshow(Z) # 创建圆形裁剪路径 h, w = Z.shape center = (w//2, h//2) radius = min(h, w) // 2 circle = Circle(center, radius, transform=ax.transData) # 为图像设置裁剪路径 im.set_clip_path(circle) plt.show()
内容的提问来源于stack exchange,提问作者zxdawn
相关产品推荐
相关产品推荐

