当前位置:   article > 正文

基于Gradio实现的AI扩图(Outpainting)

outpainting

1 什么是Outpainting

Outpainting(图像外部填充)是一种图像处理技术,与Inpainting(图像内部填充)相反,可以根据现有图像的内容、风格和上下文,合成与原始图像相协调的新内容,从而扩展图像的视觉范围。通俗地说,Outpainting也属于图像编辑,只是把Mask区域改成往外扩展而已。通过以下例子直观感受两者的相似与区别:

内部填充(Inpainting)

原始图片

MASK

结果
提示词:Face of a yellow cat, high resolution, sitting on a park bench

外部填充(Outpainting)

原始图片
MASK
结果
提示词:A girl sitting in a library full of books

上述例子验证了对于Outpainting而言,只是把mask区域改成往外扩展而已,说明背后原理是一样的,那就可以用StableDiffusion的InpaintingPipeline来做图像的Outpainting。

2 基于Gradio快速实现Outpainting

无论是Inpainting还是Outpainting,除了初始图片外,还需要一张Mask图片。 之前的文章写过可以用Gradio的ImageEditor来实现图像的编辑功能(涂鸦),进而获取Inpainting的Mask图片。 对于Outpainting而言,需要做的是一张底片即可,不需要在这张底片上进行涂鸦。但是对这张底片有要求,尺寸不超过所需Outpainting的尺寸。如果已有底片尺寸比所需Outpainting的尺寸小,可以直接用这种底片做Mask,否则需要用ImageEditor的裁剪功能,但是ImageEditor的裁剪只能在原图基础上裁剪出正方形,如果需要裁剪成长宽可以用resize把图片尺寸修改为指定的长宽,这样不受原始图片长宽比例的限制。对于更加复杂的边缘,建议使用其他工具进行裁剪。

一般情况下,需要用Js写一个组件来实现Mask图片的尺寸、位置变换,以及预览。但这里提供一个更简便的方法,不用去写Js,直接用Gradio提供的组件稍微优化一下即可实现所需功能。

def make_outpaint_img(cropped_image, target_width, target_height, x, y):
    
    black_img = Image.new('RGB', (target_width, target_height), (0, 0, 0))
    cropped_width, cropped_height = cropped_image.size
    black_img.paste(cropped_image, (x, y, x + cropped_width, y + cropped_height))
    return black_img
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

使用过程

在这里插入图片描述
使用resize修改图片尺寸为96*96。实现方法可以看Stable Diffusion中的图像修改尺寸和编辑工具实现
在这里插入图片描述
复制图片
在这里插入图片描述
ImageEditor支持从剪贴板粘贴图片

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过调整水平和垂直方向,实现Outpainting后的图像效果预览。

在这里插入图片描述
使用InpaintingPipeline进行图像填补,提示词:An old man hold the dog in his hands

在这里插入图片描述
Outpainting最终效果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/604108
推荐阅读
相关标签
  

闽ICP备14008679号