Colorful Image Colorization原理及源码详解
项目的网页
项目源代码
目录
引言
算法原理
一、网络结构
二、图像预处理和后处理
源代码解析
一、目录结构
二、demo_release.py
三、eccv16.py siggraph17.py
四、util.py
结果展示
引言
Colorful Image Colorization是一个较为稳定的黑白图片上色算法,其原理和代码也相对简单。在ECCV 2016上展示了第一代模型,后来又在SIGGRAPH 2017发布了改进之后的模型。优化后的模型更加稳定,上色效果也更加接近现实。
算法原理
一、网络结构
算法的主要原理是,将一张LAB格式灰度图片的L通道,输入模型进行推理,推理出其AB通道,最后将原始的L通道和推理出的AB通道结合起来,得到一张上色的图片。
一般常见的图片格式是RGB,有三个通道分别表示红色、绿色、蓝色。三个颜色组合出各种不同的颜色。而LAB图片格式的L通道表示图像的亮度,取值范围为0到100,颜色越大表示颜色越亮。AB的值域都是从-128到+128,A代表从绿色到红色的分量,B代表从蓝色到黄色的分量。
二、图像预处理和后处理
所有输入的图像都会被resize成256×256的大小。为了最后输出图像的清晰度,所以需要保留原始输入图像的L通道。将图像转换成LAB格式,然后提取L通道,输入模型。输入模型的size应该是1×1×256×256。
经过模型推理,输出的size应该是1×2×256×256。将预测的AB通道resize成原始图像大小,然后和原始图像的L通道合并,得到最后的结果。
源代码解析
一、目录结构
colorizers中是主要的模型代码以及图片处理的代码
imgs 存放输入图片
imgs_out 存放输出图片
demo_release.py 组织代码,运行程序的文件
二、demo_release.py
import argparse
import matplotlib.pyplot as pltfrom colorizers import *parser = argparse.ArgumentParser()
parser.add_argument('-i','--img_path', type=str, default='imgs/ansel_adams3.jpg') #输入图片路径
parser.add_argument('--use_gpu', action='store_true', help='whether to use GPU') #是否使用GPU
parser.add_argument('-o','--save_prefix', type=str, default='saved', help='will save into this file with {eccv16.png, siggraph17.png} suffixes') #保存图片路径
opt = parser.parse_args()# load colorizers
colorizer_eccv16 = eccv16(pretrained=True).eval() #初始化eccv16网络
colorizer_siggraph17 = siggraph17(pretrained=True).eval() #初始化siggraph17网络
if(opt.use_gpu):colorizer_eccv16.cuda()colorizer_siggraph17.cuda()img = load_img(opt.img_path) #加载图片
(tens_l_orig, tens_l_rs) = preprocess_img(img, HW=(256,256)) #图片预处理
if(opt.use_gpu):tens_l_rs = tens_l_rs.cuda()img_bw = postprocess_tens(tens_l_orig, torch.cat((0*tens_l_orig,0*tens_l_orig),dim=1))
out_img_eccv16 = postprocess_tens(tens_l_orig, colorizer_eccv16(tens_l_rs).cpu()) #推理和图片后处理
out_img_siggraph17 = postprocess_tens(tens_l_orig, colorizer_siggraph17(tens_l_rs).cpu()) #推理和图片后处理plt.imsave('%s_eccv16.png'%opt.save_prefix, out_img_eccv16) #保存图片
plt.imsave('%s_siggraph17.png'%opt.save_prefix, out_img_siggraph17) #保存图片
在此文件中可以自定义输入输出文件路径。
三、eccv16.py siggraph17.py
定义eccv16和siggraph17的网络结构,下载对应的权重文件。
四、util.py
from PIL import Image
import numpy as np
from skimage import color
import torch
import torch.nn.functional as F
from IPython import embeddef load_img(img_path): # 加载图片out_np = np.asarray(Image.open(img_path)) #将图片转为numpy数组if(out_np.ndim==2):out_np = np.tile(out_np[:,:,None],3)return out_npdef resize_img(img, HW=(256,256), resample=3): # 调整图片大小return np.asarray(Image.fromarray(img).resize((HW[1],HW[0]), resample=resample))def preprocess_img(img_rgb_orig, HW=(256,256), resample=3): #图片与处理img_rgb_rs = resize_img(img_rgb_orig, HW=HW, resample=resample) #将图片调整为256×256img_lab_orig = color.rgb2lab(img_rgb_orig) #rgb格式转换为lab格式img_lab_rs = color.rgb2lab(img_rgb_rs)img_l_orig = img_lab_orig[:,:,0] #取图片的L通道img_l_rs = img_lab_rs[:,:,0]tens_orig_l = torch.Tensor(img_l_orig)[None,None,:,:] #转换成tensortens_rs_l = torch.Tensor(img_l_rs)[None,None,:,:]return (tens_orig_l, tens_rs_l)def postprocess_tens(tens_orig_l, out_ab, mode='bilinear'): #图片后处理HW_orig = tens_orig_l.shape[2:] #取原始图片的长宽HW = out_ab.shape[2:]if(HW_orig[0]!=HW[0] or HW_orig[1]!=HW[1]): #恢复到原始图片大小out_ab_orig = F.interpolate(out_ab, size=HW_orig, mode='bilinear')else:out_ab_orig = out_about_lab_orig = torch.cat((tens_orig_l, out_ab_orig), dim=1) # L+ABreturn color.lab2rgb(out_lab_orig.data.cpu().numpy()[0,...].transpose((1,2,0))) #转换为rgb图片
结果展示
原图:
ECCV 2016:
SIGGRAPH 2017 :
Colorful Image Colorization原理及源码详解相关推荐
- 【分类器 Softmax-Classifier softmax数学原理与源码详解 深度学习 Pytorch笔记 B站刘二大人(8/10)】
分类器 Softmax-Classifier softmax数学原理与源码详解 深度学习 Pytorch笔记 B站刘二大人 (8/10) 在进行本章的数学推导前,有必要先粗浅的介绍一下,笔者在广泛查找 ...
- xuelipay 个人即时到账收款平台 原理及源码详解 支持支付宝微信
现状及解决原理 1.1 现状 1.2 原理 1.3 例子 收款到完成收款过程源码详解 1 上传账户的收款码 2.2 创建订单 2.3 手机app 监听 2.4 服务器处理付款完成通知 漏单原理及漏单的 ...
- CAS和ASQ原理(源码详解)
前面介绍Java中的锁机制时简单介绍过CAS和ASQ,这篇文章则是进行详细的学习介绍. 一.CAS(CompareAndSwamp,比较并交换) 1.简介 CAS有3个操作数: 内存值V.预期值A.更 ...
- Spring源码深度解析(五):Spring AOP原理及源码详解
前言 OOP表示面向对象编程,是一种编程思想:AOP表示面向切面编程,也是一种编程思想,AOP的概念可以参考文章:SpringAOP基本概念详解. 正文 1.AbstractAdvisorAutoPr ...
- fdct算法 java_ImageSharp源码详解之JPEG压缩原理(3)DCT变换
DCT变换可谓是JPEG编码原理里面数学难度最高的一环,我也是因为DCT变换的算法才对JPEG编码感兴趣(真是不自量力).这一章我就把我对DCT的研究心得体会分享出来,希望各位大神也不吝赐教. 1.离 ...
- 【 卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10)】
卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10) 本章主要进行卷积神经网络的相关数学原理和pytorch的对应模块进行推导分析 代码也是通过demo实 ...
- 【多输入模型 Multiple-Dimension 数学原理分析以及源码详解 深度学习 Pytorch笔记 B站刘二大人 (6/10)】
多输入模型 Multiple-Dimension 数学原理分析以及源码源码详解 深度学习 Pytorch笔记 B站刘二大人(6/10) 数学推导 在之前实现的模型普遍都是单输入单输出模型,显然,在现实 ...
- Go 语言 bytes.Buffer 源码详解之1
转载地址:Go 语言 bytes.Buffer 源码详解之1 - lifelmy的博客 前言 前面一篇文章 Go语言 strings.Reader 源码详解,我们对 strings 包中的 Reade ...
- Go bufio.Reader 结构+源码详解
转载地址:Go bufio.Reader 结构+源码详解 I - lifelmy的博客 前言 前面的两篇文章 Go 语言 bytes.Buffer 源码详解之1.Go 语言 bytes.Buffer ...
最新文章
- (C++)用upper_bound函数取代自己写的二分查找
- 这道「传说级」的数学题,为什么有 3 个正确答案?
- C语言linux gettimeofday()函数和time()函数的区别(后者只能得到秒级系统时间,前者能得到毫秒甚至微秒级系统时间)
- 在 C++中处理错误
- # 2019-2020.3 《java程序设计》第一周学习总结
- 我整理了100G的.Net学习资料,速来领取!
- 字体文件解析 c语言,如何正确地从C语言的文件中读取某些字符串?
- java nio 连接数_Java NIO 基础一 NIO概念
- cookie购物车php简单,php中利用cookie实现购物车实例_PHP教程
- python线程池的使用
- linux 共享内存 信号量 同步
- 《基于MFC的OpenGL编程》Part 7 Animation
- word引用 html文件路径,Word怎么引用网页文档
- 张云茹计算机,重庆理工大学药学与生物工程学院研究生导师简介-张云茹
- 卷积神经网络流程图_AAAI 2020 | 北大:图卷积中的多阶段自监督学习算法
- 转载:各个手机尺寸版本
- EtherCAT主站SOEM在Ubuntu上的移植
- c 工厂模式与mysql链接_工厂模式连接数据库
- 2022-2027年中国品牌连锁酒店行业发展前景及投资战略咨询报告
- [含论文+源码等]ssm框架外卖订餐系统
热门文章
- 代理模式Proxy (非常容易看懂)
- 网狐棋牌手端无法进入登录页面
- windows安装linux子系统,并装在其他系统盘的方法
- AE基础教程(14)——第14章 塌陷
- 当前安全设置禁止运行该页中activeX控件,该页无法正常显示
- 每日新闻:腾讯内部架构大调整;首个网民网络安全感满意度调查报告发布-网民满意度总体中等偏上;马斯克将辞任特斯拉董事长...
- mmdetection - config配置文件之datasets
- 实践+收藏版——Linux 性能优化知识点总结大全!
- 现成的前后端项目脚手架
- 在SQLServer处理中的一些问题及解决方法