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 plt

from 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 embed

def 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_np

def 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×256
	
	img_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,:,:]   #转换成tensor
	tens_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_ab

	out_lab_orig = torch.cat((tens_orig_l, out_ab_orig), dim=1)   # L+AB
	return color.lab2rgb(out_lab_orig.data.cpu().numpy()[0,...].transpose((1,2,0)))  #转换为rgb图片

结果展示

原图:

ECCV 2016:

SIGGRAPH 2017 :

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
颜色图像着色是计算机视觉中的一个重要任务,它可以将黑白图像转换为彩色图像。在Python中,您可以使用深度学习技术来实现彩色图像着色。下面是使用Colorful Image Colorization算法进行彩色图像着色的步骤: 1. 安装依赖库:首先需要安装PyTorch和OpenCV库。 2. 下载预训练模型:从GitHub上下载Colorful Image Colorization预训练模型。 3. 加载模型:使用PyTorch库加载预训练模型。 4. 加载图像:使用OpenCV库加载要着色的图像。 5. 图像预处理:对图像进行预处理,包括缩放和归一化。 6. 执行模型:将预处理后的图像输入到模型中,执行彩色图像着色。 7. 显示结果:使用OpenCV库显示着色后的图像。 下面是一个简单的Python代码示例,用于基于Colorful Image Colorization算法实现图像着色: ```python import torch import cv2 # 加载预训练模型 model_path = 'colorization_release_v2-9b330a0b.pth' model = torch.load(model_path, map_location=torch.device('cpu')) model.eval() # 加载图像 img_path = 'bw.jpg' img = cv2.imread(img_path) # 图像预处理 img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img = cv2.resize(img, (256, 256)) img = img.astype("float32") / 255.0 img = torch.from_numpy(img).unsqueeze(0).unsqueeze(0) # 执行模型 output = model(img) output = output.data.cpu().numpy().squeeze().transpose((1, 2, 0)) output = cv2.resize(output, (img.shape[2], img.shape[3])) output = cv2.cvtColor(output, cv2.COLOR_LAB2BGR) # 显示结果 cv2.imshow('Colorized Image', output) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码中,我们首先加载了预训练模型,然后使用OpenCV库加载了要着色的黑白图像。接下来,我们对图像进行了预处理,并将其输入到预训练模型中执行彩色图像着色操作。最后,我们使用OpenCV库显示着色后的图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值