项目的网页

项目源代码

目录

引言

算法原理

一、网络结构

二、图像预处理和后处理

源代码解析

一、目录结构

二、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原理及源码详解相关推荐

  1. 【分类器 Softmax-Classifier softmax数学原理与源码详解 深度学习 Pytorch笔记 B站刘二大人(8/10)】

    分类器 Softmax-Classifier softmax数学原理与源码详解 深度学习 Pytorch笔记 B站刘二大人 (8/10) 在进行本章的数学推导前,有必要先粗浅的介绍一下,笔者在广泛查找 ...

  2. xuelipay 个人即时到账收款平台 原理及源码详解 支持支付宝微信

    现状及解决原理 1.1 现状 1.2 原理 1.3 例子 收款到完成收款过程源码详解 1 上传账户的收款码 2.2 创建订单 2.3 手机app 监听 2.4 服务器处理付款完成通知 漏单原理及漏单的 ...

  3. CAS和ASQ原理(源码详解)

    前面介绍Java中的锁机制时简单介绍过CAS和ASQ,这篇文章则是进行详细的学习介绍. 一.CAS(CompareAndSwamp,比较并交换) 1.简介 CAS有3个操作数: 内存值V.预期值A.更 ...

  4. Spring源码深度解析(五):Spring AOP原理及源码详解

    前言 OOP表示面向对象编程,是一种编程思想:AOP表示面向切面编程,也是一种编程思想,AOP的概念可以参考文章:SpringAOP基本概念详解. 正文 1.AbstractAdvisorAutoPr ...

  5. fdct算法 java_ImageSharp源码详解之JPEG压缩原理(3)DCT变换

    DCT变换可谓是JPEG编码原理里面数学难度最高的一环,我也是因为DCT变换的算法才对JPEG编码感兴趣(真是不自量力).这一章我就把我对DCT的研究心得体会分享出来,希望各位大神也不吝赐教. 1.离 ...

  6. 【 卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10)】

    卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10) 本章主要进行卷积神经网络的相关数学原理和pytorch的对应模块进行推导分析 代码也是通过demo实 ...

  7. 【多输入模型 Multiple-Dimension 数学原理分析以及源码详解 深度学习 Pytorch笔记 B站刘二大人 (6/10)】

    多输入模型 Multiple-Dimension 数学原理分析以及源码源码详解 深度学习 Pytorch笔记 B站刘二大人(6/10) 数学推导 在之前实现的模型普遍都是单输入单输出模型,显然,在现实 ...

  8. Go 语言 bytes.Buffer 源码详解之1

    转载地址:Go 语言 bytes.Buffer 源码详解之1 - lifelmy的博客 前言 前面一篇文章 Go语言 strings.Reader 源码详解,我们对 strings 包中的 Reade ...

  9. Go bufio.Reader 结构+源码详解

    转载地址:Go bufio.Reader 结构+源码详解 I - lifelmy的博客 前言 前面的两篇文章 Go 语言 bytes.Buffer 源码详解之1.Go 语言 bytes.Buffer ...

最新文章

  1. (C++)用upper_bound函数取代自己写的二分查找
  2. 这道「传说级」的数学题,为什么有 3 个正确答案?
  3. C语言linux gettimeofday()函数和time()函数的区别(后者只能得到秒级系统时间,前者能得到毫秒甚至微秒级系统时间)
  4. 在 C++中处理错误
  5. # 2019-2020.3 《java程序设计》第一周学习总结
  6. 我整理了100G的.Net学习资料,速来领取!
  7. 字体文件解析 c语言,如何正确地从C语言的文件中读取某些字符串?
  8. java nio 连接数_Java NIO 基础一 NIO概念
  9. cookie购物车php简单,php中利用cookie实现购物车实例_PHP教程
  10. python线程池的使用
  11. linux 共享内存 信号量 同步
  12. 《基于MFC的OpenGL编程》Part 7 Animation
  13. word引用 html文件路径,Word怎么引用网页文档
  14. 张云茹计算机,重庆理工大学药学与生物工程学院研究生导师简介-张云茹
  15. 卷积神经网络流程图_AAAI 2020 | 北大:图卷积中的多阶段自监督学习算法
  16. 转载:各个手机尺寸版本
  17. EtherCAT主站SOEM在Ubuntu上的移植
  18. c 工厂模式与mysql链接_工厂模式连接数据库
  19. 2022-2027年中国品牌连锁酒店行业发展前景及投资战略咨询报告
  20. [含论文+源码等]ssm框架外卖订餐系统

热门文章

  1. 代理模式Proxy (非常容易看懂)
  2. 网狐棋牌手端无法进入登录页面
  3. windows安装linux子系统,并装在其他系统盘的方法
  4. AE基础教程(14)——第14章 塌陷
  5. 当前安全设置禁止运行该页中activeX控件,该页无法正常显示
  6. 每日新闻:腾讯内部架构大调整;首个网民网络安全感满意度调查报告发布-网民满意度总体中等偏上;马斯克将辞任特斯拉董事长...
  7. mmdetection - config配置文件之datasets
  8. 实践+收藏版——Linux 性能优化知识点总结大全!
  9. 现成的前后端项目脚手架
  10. 在SQLServer处理中的一些问题及解决方法