【深度学习风格化/生成艺术】图像融合--毫无违和

379 篇文章 61 订阅
261 篇文章 13 订阅
玩转图像,可以玩一整天的图像生成

Deep Painterly Harmonization
来自康奈尔大学的FujunLuan,在最近的文章中发表了一种可以再油画、名画和各种风格的原图中,嵌入自己个性化的部分,并毫无违和感的展示出来。研究表明局域统计特征对于图像的融入十分重要、生成高质量图像的关键在于保证多尺度统计特征和空间的连续性。

在这里插入图片描述

相关工作
  • 图像共融–Image Harmonization.
  • 风格迁移–Style Transfer using Neural Networks
算法

损失主要分为三部分:

  • 标准的风格和内容损失
    在这里插入图片描述
  • 直方图损失,增加上式稳定性:
    在这里插入图片描述
  • 全局方差损失,增加图像平滑过渡:
    在这里插入图片描述

具体的步骤分为:

  • 鲁棒的粗融合:包括了映射和重建
  • 高质量的精融合:同业也是映射与重建
  • 后处理阶段包含了色度去噪、图像分片合成
  • 训练painting estimator 来获取优化参数

一些结果:
一些好看的图

作者

Fujun Luan是康奈尔大学博士,主要集中于图形学渲染方向和风格迁移领域的研究,去年一篇著名的图像风格迁移论文deep photo style transfer也出自他之手。
在这里插入图片描述

代码实现

作者的代码主要包含torch、cudnn和matlab写的代码。其中cudnn用于加速、torch用于风格迁移生成、matlab用于后处理。

python

其python代码主要是调用了torch写的lua脚本

import os
import math

numImgs = 35   #需要生成的图像数量
# numGpus = 16 
numGpus = 1   #使用的GPU数量

if os.path.exists('results') == 0:
	os.mkdir('results')   #图像在git文件夹下resulte下

N = int(math.ceil(float(numImgs)/numGpus))   #分配

for j in range(1, numGpus+1):
	cmd = ''
	for i in range(1, N+1):
		idx = (i-1) * numGpus + (j-1)
		if idx >= 0 and idx < numImgs:
			print('Working on image idx = ', idx)
			#https://github.com/luanfujun/deep-painterly-harmonization/blob/master/neural_gram.lua
			part_cmd1 =' th neural_gram.lua '\     #计算格拉姆矩阵,各种风格迁移、掩膜等等
					   ' -content_image data/' + str(idx) + '_naive.jpg  '\
					   ' -style_image   data/' + str(idx) + '_target.jpg '\
					   ' -tmask_image   data/' + str(idx) + '_c_mask.jpg '\
					   ' -mask_image    data/' + str(idx) + '_c_mask_dilated.jpg '\
					   ' -gpu ' + str(j-1) + ' -original_colors 0 -image_size 700 '\
					   ' -output_image  results/' + str(idx) + '_inter_res.jpg'\
					   ' -print_iter 100 -save_iter 100 && '
			#https://github.com/luanfujun/deep-painterly-harmonization/blob/master/neural_paint.lua
			part_cmd2 =' th neural_paint.lua '\     #生成painting,精细化的融合新加入的图像
					   ' -content_image data/' + str(idx) + '_naive.jpg '\
					   ' -style_image   data/' + str(idx) + '_target.jpg '\
					   ' -tmask_image   data/' + str(idx) + '_c_mask.jpg '\
					   ' -mask_image    data/' + str(idx) + '_c_mask_dilated.jpg '\
					   ' -cnnmrf_image  results/' + str(idx) + '_inter_res.jpg  '\
					   ' -gpu ' + str(j-1) + ' -original_colors 0 -image_size 700 '\
					   ' -index ' + str(idx) + ' -wikiart_fn data/wikiart_output.txt '\
					   ' -output_image  results/' + str(idx) + '_final_res.jpg' \
					   ' -print_iter 100 -save_iter 100 '\
					   ' -num_iterations 1000 &&' 
			cmd = cmd + part_cmd1 + part_cmd2
	cmd = cmd[1:len(cmd)-1]
	print(cmd)
	os.system(cmd)
matlab

作者同时还提供了matlab代码来进行后处理:

for i = 0:34
    close all

    in_fn  = ['results/' int2str(i) '_final_res.png'];  %输入输入
    out_fn = ['results/' int2str(i) '_final_res2.png'];
    
    if exist(in_fn, 'file') ~= 2 
        fprintf('file doesn''t exist: %s\n', in_fn); 
        continue
    end 
    if exist(out_fn, 'file') == 2 
        fprintf('result already exists: %s\n', out_fn); 
        continue
    end 

    I = im2double(imread(in_fn));

    G = im2double(imread(['data/' int2str(i) '_naive.jpg']));    %原图
    M = im2double(imread(['data/' int2str(i) '_c_mask.jpg']));   %mask图像
    B = im2double(imread(['data/' int2str(i) '_target.jpg']));   %目标图


    tr= 3;
    h = fspecial('gaussian', [2*tr+1 2*tr+1], tr);
    sM = imfilter(M, h, 'same'); 
    sM(sM > 0.01) = 1; % dialte
    sM(sM < 0.01) = 0;
    sM = imfilter(sM, h, 'same'); 

    addpath 3rdparty/colorspace
    I_lab = colorspace('rgb->lab', I);   %颜色空间lab转换

    addpath 3rdparty/guided_filter    %引导滤波器
    addpath 3rdparty/patchmatch-2.0    %图像片元匹配

    r = 2; % try r=2, 4, or 8    %一些超参数
    eps = 0.1^2; % try eps=0.1^2, 0.2^2, 0.4^2

    O_lab = I_lab;
    O_lab(:,:,2) = guidedfilter_color(G, I_lab(:,:,2), r, eps);   %引导滤波器:ref:https://arxiv.org/abs/1505.00996
    O_lab(:,:,3) = guidedfilter_color(G, I_lab(:,:,3), r, eps);

    % runs here, deconvolution CNN artifact removed   %去除解卷积的人工痕迹
    O1 = colorspace('lab->rgb', O_lab);
    % one patchmatch pass to further remove color artifact
    cores = 4; 
    algo = 'cputiled';
    patch_w = 7;
    ann = nnmex(O1, B, algo, patch_w, [], [], [], [], [], cores);
    O2_base = im2double(votemex(B, ann));

    r = 3;
    h = fspecial('gaussian', [2*r+1 2*r+1], r/3);
    O1_base = imfilter(O1, h, 'same');
    O2 = O2_base + O1 - O1_base;

    O2 = O2.*sM + B.*(1-sM);
    figure; imshow(I)
    figure; imshow(O2)

    imwrite(O2, out_fn);
end 

TODO:代码run demo


ref:
https://arxiv.org/pdf/1804.03189.pdf
https://www.cs.cornell.edu/~fujun/
https://github.com/luanfujun/deep-painterly-harmonizatio
results:https://github.com/luanfujun/deep-painterly-harmonization/blob/master/README2.md
deep photo transfer:https://blog.csdn.net/cicibabe/article/details/70868746,https://arxiv.org/pdf/1703.07511.pdf

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像风格迁移是一个研究热点的领域,国内外都有很多相关的研究工作。以下是图像风格迁移的国内外研究现状: 1. 国外研究现状: - Gatys等人在2015年提出了一种基于神经网络的图像风格迁移方法,该方法使用卷积神经网络来提取图像的内容和风格特征,并通过最小化内容和风格之间的差异来生成迁移后的图像。 - Johnson等人在2016年提出了一种快速的图像风格迁移方法,该方法使用了一个预训练的卷积神经网络来学习图像的风格,并通过一个反卷积神经网络来生成迁移后的图像。 - Ulyanov等人在2016年提出了一种基于实例归一化的图像风格迁移方法,该方法通过对输入图像进行归一化来实现风格的迁移。 2. 国内研究现状: - 李飞飞等人在2017年提出了一种基于生成对抗网络的图像风格迁移方法,该方法使用了一个生成器网络和一个判别器网络来实现图像的风格迁移。 - 周明等人在2018年提出了一种基于多尺度卷积神经网络的图像风格迁移方法,该方法通过在不同尺度上提取图像的内容和风格特征来实现风格的迁移。 - 王晓等人在2019年提出了一种基于深度特征融合的图像风格迁移方法,该方法通过将内容和风格特征进行融合来实现风格的迁移。 总的来说,图像风格迁移的研究在国内外都取得了很多进展,不同的方法都有各自的优势和适用场景。未来的研究方向可能包括更加高效和准确的图像风格迁移方法,以及与其他任务的结合,如图像生成和图像修复等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值