Python+DeOldify实现老照片上色功能


Posted in Python onJune 21, 2022

前言

老照片上色其实很早之前就想写了,也有不少人问了我这个项目。

最近把DeOldify项目好好弄了弄。

项目地址:DeOldify项目地址

先看看项目给出的图片对比效果。

Python+DeOldify实现老照片上色功能

Python+DeOldify实现老照片上色功能

从给出的效果可以看出,上色后的图片对人物、景色、物品、环境等等都变得很生动。

下面来安装一下项目执行环境,测试一下自己的图片。

安装

看一下项目的README中关于安装的部分。

Python+DeOldify实现老照片上色功能

使用anaconda安装环境。安装完成后看一下模型文件需要下载哪些。

Python+DeOldify实现老照片上色功能

仔细看看,文章给出了不同模型的区别。

Python+DeOldify实现老照片上色功能

从作者的描述中,可以看出前面2个主要是针对图像的模型,一个艺术一个稳定,等下使用的时候看看区别。

三个模型如果比较难下载,可以从我的网盘下载,地址如下。

链接 提取码:kr3c 

下载的3个模型文件放到项目根目录下models文件夹内,没有就创建models。

Python+DeOldify实现老照片上色功能

代码改造使用

作者在README中给出了docker快速启动以及api启动方式。有点麻烦,还是自己改一下。

先看一下app.py代码内容。

@app.route("/process", methods=["POST"])
def process_image():
 
    input_path = generate_random_filename(upload_directory,"jpeg")
    output_path = os.path.join(results_img_directory, os.path.basename(input_path))
 
    try:
        if 'file' in request.files:
            file = request.files['file']
            if allowed_file(file.filename):
                file.save(input_path)
            try:
                render_factor = request.form.getlist('render_factor')[0]
            except:
                render_factor = 30
            
        else:
            url = request.json["url"]
            download(url, input_path)
 
            try:
                render_factor = request.json["render_factor"]
            except:
                render_factor = 30
 
        result = None
 
        try:
            result = image_colorizer.get_transformed_image(input_path, render_factor=render_factor, post_process=True, watermarked=True)
        except:
            convertToJPG(input_path)
            result = image_colorizer.get_transformed_image(input_path, render_factor=render_factor, post_process=True, watermarked=True)
        finally:
            if result is not None:
                result.save(output_path, quality=95)
                result.close()
 
        callback = send_file(output_path, mimetype='image/jpeg')
        return callback, 200
 
    except:
        traceback.print_exc()
        return {'message': 'input error'}, 400
 
    finally:
        pass
        clean_all([
            input_path,
            output_path
            ])

可以看出该POST接口主要操作分为:获取文件流、根据参数调整渲染因子(默认为30)、通过image_colorizer对象进行染色操作、最终将文件流返回。按照这个方法我改造了一个直接使用的工具方法。

代码如下:

#!/user/bin/env python
# coding=utf-8
"""
@project : DeOldify
@author  : 剑客阿良_ALiang
@file   : test1.py
@ide    : PyCharm
@time   : 2022-06-17 16:37:13
"""
import os
from pathlib import Path
 
from app_utils import convertToJPG
from deoldify.visualize import ModelImageVisualizer, get_image_colorizer
 
 
def colorizer(input_path, output_dir):
    _output_path = os.path.join(output_dir, os.path.basename(input_path))
    _image_colorizer = get_image_colorizer(artistic=True)
    try:
        result = _image_colorizer.get_transformed_image(input_path, render_factor=30, post_process=True,
                                                        watermarked=True)
    except:
        convertToJPG(input_path)
        result = _image_colorizer.get_transformed_image(input_path, render_factor=30, post_process=True,
                                                        watermarked=True)
    finally:
        if result is not None:
            result.save(_output_path, quality=95)
            result.close()
 
 
if __name__ == '__main__':
    colorizer("./data/image/xxx1.jpg", "./data/result1")

一些异常情况我就不处理,如果需要的话,使用的时候加一些补充代码即可。

artistic参数作为是否使用艺术模型的bool参数。

看一下我准备的需要上色的照片。

Python+DeOldify实现老照片上色功能

选择Artistic模型的效果如下:

Python+DeOldify实现老照片上色功能

选择Stable模型的效果如下:

Python+DeOldify实现老照片上色功能

还是可以看出一些区别的,只是本人没啥艺术细菌,看不大出来怎么个艺术法。

注意

1、 上面的工具代码由于引入了项目中的几个方法,可能存在引入包缺失问题。补充安装如下:

pip install opencv-python -i https://pypi.douban.com/simple
pip install scikit-image -i https://pypi.douban.com/simple
pip install ffmpeg -i https://pypi.douban.com/simple

2、安装scikit-image的时候会安装Pillow最新版本,可能会导致执行错误,补充卸载安装Pillow如下:

pip uninstall Pillow
pip install Pillow==6.2.2 

以上就是Python+DeOldify实现老照片上色功能的详细内容,更多关于Python DeOldify老照片上色的资料请关注三水点靠木其它相关文章!


Tags in this post...

Python 相关文章推荐
Python使用面向对象方式创建线程实现12306售票系统
Dec 24 Python
Python实例一个类背后发生了什么
Feb 09 Python
TensorFlow实现Softmax回归模型
Mar 09 Python
对python字典元素的添加与修改方法详解
Jul 06 Python
Mac下Anaconda的安装和使用教程
Nov 29 Python
python 将大文件切分为多个小文件的实例
Jan 14 Python
python机器人运动范围问题的解答
Apr 29 Python
关于Python作用域自学总结
Jun 10 Python
Python程序打包工具py2exe和PyInstaller详解
Jun 28 Python
详解Python time库的使用
Oct 10 Python
5个pandas调用函数的方法让数据处理更加灵活自如
Apr 24 Python
Python四款GUI图形界面库介绍
Jun 05 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 #Python
virtualenv隔离Python环境的问题解析
Jun 21 #Python
pd.drop_duplicates删除重复行的方法实现
Jun 16 #Python
使用pd.merge表连接出现多余行的问题解决
Jun 16 #Python
pd.DataFrame中的几种索引变换的实现
Python实战实现爬取天气数据并完成可视化分析详解
pandas时间序列之pd.to_datetime()的实现
Jun 16 #Python
You might like
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
PHP以及MYSQL日期比较方法
2012/11/29 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
CI映射(加载)数据到view层的方法
2016/03/28 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
JavaScript函数详解
2015/02/27 Javascript
jQuery原型属性和原型方法详解
2015/07/07 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
javascript实现显示和隐藏div方法汇总
2015/08/14 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
关于AngularJS中几种Providers的区别总结
2020/05/17 Javascript
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
微信小程序入门之绘制时钟
2020/10/22 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
[02:28]DOTA2英雄基础教程 狼人
2013/12/23 DOTA
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
网页设计个人找工作求职信
2013/11/28 职场文书
文明市民先进事迹
2014/05/15 职场文书
本科毕业论文致谢怎么写
2015/05/14 职场文书
小学安全工作总结2015
2015/05/18 职场文书
民主生活会主持词
2015/07/01 职场文书
职工宿舍管理制度
2015/08/05 职场文书
python实现腾讯滑块验证码识别
2021/04/27 Python
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python
Mysql存储过程、触发器、事件调度器使用入门指南
2022/01/22 MySQL
通过Python把学姐照片做成拼图游戏
2022/02/15 Python