今天介绍 Siggraph 2004 年的一篇文章: Colorization using Optimization,利用优化的方法对灰度图像进行着色,这里用到了非常经典的泊松方程以及稀疏矩阵的线性优化。简单来说,就是对一张灰度图像先人为地进行着色,然后利用优化的方法,对其他的没有颜色的区域进行填充。这些处理都是在 YUV 颜色空间进行的。

给定一个 Y 通道的图像,我们希望基于一定的先验知识,恢复出图像的U, V 通道。这里的一个重要假设就是 对于相邻的两个像素,如果其亮度比较相似,那么其颜色也应该相似。

假设 r,s 表示相邻两个像素的位置,那么我们希望最小化如下的目标函数:

J(U)=∑r⎛⎝U(r)−∑s∈N(r)wrsU(s)⎞⎠2

对于 V 通道,我们可以建立类似的目标函数,而其中的系数 wrs 可以由 Y 通道表示:

wrs=e−(Y(r)−Y(s))2/2σ2

只要给定了 σ 以及像素的位置关系,我们可以很方便的求出系数 wrs。

首先,需要对图像进行一些简单的着色,我们可以得到一系列的像素点 ri 的颜色值, u(ri)=ui, v(ri)=vi , 根据这些预先设定的像素点的颜色值,再结合上面的目标函数,我们可以建立一个很大的稀疏线性方程组,假设图像的尺寸为 M×N, 那么图像的像素个数为 np=MN, 我们要解的方程组将是 np 个,稀疏矩阵的大小为 np×np,比如一张 800×600 的图像,需要解的方程组将是 480000 个,稀疏矩阵的大小将是 480000×480000 这是一个非常大的矩阵。不过由于这是稀疏的,所以会有很多标准的解法。

下面给出 matlab 代码


g_name='example.bmp';
c_name='example_marked.bmp';
out_name='example_res.bmp'; %set solver=1 to use a multi-grid solver
%and solver=2 to use an exact matlab "\" solver
solver=2; gI=double(imread(g_name))/255;
cI=double(imread(c_name))/255;
colorIm=(sum(abs(gI-cI),3)>0.01);
colorIm=double(colorIm); sgI=rgb2ntsc(gI);
scI=rgb2ntsc(cI); ntscIm(:,:,1)=sgI(:,:,1);
ntscIm(:,:,2)=scI(:,:,2);
ntscIm(:,:,3)=scI(:,:,3); max_d=floor(log(min(size(ntscIm,1),size(ntscIm,2)))/log(2)-2);
iu=floor(size(ntscIm,1)/(2^(max_d-1)))*(2^(max_d-1));
ju=floor(size(ntscIm,2)/(2^(max_d-1)))*(2^(max_d-1));
id=1; jd=1;
colorIm=colorIm(id:iu,jd:ju,:);
ntscIm=ntscIm(id:iu,jd:ju,:); if (solver==1)
nI=getVolColor(colorIm,ntscIm,[],[],[],[],5,1);
nI=ntsc2rgb(nI);
else
nI=getColorExact(colorIm,ntscIm);
end figure, imshow(nI) imwrite(nI,out_name) function [nI,snI]=getColorExact(colorIm,ntscIm) n=size(ntscIm,1); m=size(ntscIm,2);
imgSize=n*m; nI(:,:,1)=ntscIm(:,:,1); indsM=reshape([1:imgSize],n,m);
lblInds=find(colorIm); wd=1; len=0;
consts_len=0;
col_inds=zeros(imgSize*(2*wd+1)^2,1);
row_inds=zeros(imgSize*(2*wd+1)^2,1);
vals=zeros(imgSize*(2*wd+1)^2,1);
gvals=zeros(1,(2*wd+1)^2); for j=1:m
for i=1:n
consts_len=consts_len+1; if (~colorIm(i,j))
tlen=0;
for ii=max(1,i-wd):min(i+wd,n)
for jj=max(1,j-wd):min(j+wd,m) if (ii~=i)|(jj~=j)
len=len+1; tlen=tlen+1;
row_inds(len)= consts_len;
col_inds(len)=indsM(ii,jj);
gvals(tlen)=ntscIm(ii,jj,1);
end
end
end
t_val=ntscIm(i,j,1);
gvals(tlen+1)=t_val;
c_var=mean((gvals(1:tlen+1)-mean(gvals(1:tlen+1))).^2);
csig=c_var*0.6;
mgv=min((gvals(1:tlen)-t_val).^2);
if (csig<(-mgv/log(0.01)))
csig=-mgv/log(0.01);
end
if (csig<0.000002)
csig=0.000002;
end gvals(1:tlen)=exp(-(gvals(1:tlen)-t_val).^2/csig);
gvals(1:tlen)=gvals(1:tlen)/sum(gvals(1:tlen));
vals(len-tlen+1:len)=-gvals(1:tlen);
end len=len+1;
row_inds(len)= consts_len;
col_inds(len)=indsM(i,j);
vals(len)=1; end
end vals=vals(1:len);
col_inds=col_inds(1:len);
row_inds=row_inds(1:len); A=sparse(row_inds,col_inds,vals,consts_len,imgSize);
b=zeros(size(A,1),1); for t=2:3
curIm=ntscIm(:,:,t);
b(lblInds)=curIm(lblInds);
new_vals=A\b;
nI(:,:,t)=reshape(new_vals,n,m,1);
end snI=nI;
nI=ntsc2rgb(nI);

机器学习:Colorization using Optimization的更多相关文章

  1. 吴恩达机器学习笔记47-K均值算法的优化目标、随机初始化与聚类数量的选择(Optimization Objective & Random Initialization & Choosing the Number of Clusters of K-Means Algorithm)

    一.K均值算法的优化目标 K-均值最小化问题,是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此 K-均值的代价函数(又称畸变函数 Distortion function)为: 其中

  2. 吴恩达机器学习笔记41-支持向量机的优化目标(Optimization Objective of Support Vector Machines)

  3. 【机器学习Machine Learning】资料大全

    昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...

  4. 机器学习——支持向量机(SVM)之拉格朗日乘子法,KKT条件以及简化版SMO算法分析

    SVM有很多实现,现在只关注其中最流行的一种实现,即序列最小优化(Sequential Minimal Optimization,SMO)算法,然后介绍如何使用一种核函数(kernel)的方式将SVM ...

  5. 【转】自学成才秘籍!机器学习&深度学习经典资料汇总

      小编都深深的震惊了,到底是谁那么好整理了那么多干货性的书籍.小编对此人表示崇高的敬意,小编不是文章的生产者,只是文章的搬运工. <Brief History of Machine Learn ...

  6. paper 127:机器学习中的范数规则化之(二)核范数与规则项参数选择

    机器学习中的范数规则化之(二)核范数与规则项参数选择 zouxy09@qq.com http://blog.csdn.net/zouxy09 上一篇博文,我们聊到了L0,L1和L2范数,这篇我们絮叨絮 ...

  7. 《Spark 官方文档》机器学习库(MLlib)指南

    spark-2.0.2 机器学习库(MLlib)指南 MLlib是Spark的机器学习(ML)库.旨在简化机器学习的工程实践工作,并方便扩展到更大规模.MLlib由一些通用的学习算法和工具组成,包括分 ...

  8. Shogun网站上的关于主流机器学习工具包的比较

    Shogun网站上的关于主流机器学习工具包的比较: http://www.shogun-toolbox.org/page/features/   created last updated main l ...

  9. 用ADMM求解大型机器学习问题

    [本文链接:http://www.cnblogs.com/breezedeus/p/3496819.html,转载请注明出处] 从等式约束的最小化问题说起:                       ...

随机推荐

  1. React学习之事件绑定

    React事件绑定有主要有三种方式 第一种官方推荐方式: class LoginControl extends React.Component {   constructor(props) {     ...

  2. we are experimenting with a new init system and it is fun

    http://0pointer.de/blog/projects/systemd.html Rethinking PID 1 If you are well connected or good at ...

  3. modelsim-altera IP核仿真

    modelsim 仿真fifo时出现 Instantiation of 'scfifo' failed. The design unit was not found. 2012-07-21 13:27 ...

  4. Java中的Enum的继承

    public interface Icolor{ int apply(int x,int y); } public enum color implements Icolor{ plus("+ ...

  5. 关于安装oracle 11g client 出现安装先决条件检查全部失败

    本文转自:https://blog.csdn.net/iloli/article/details/45244159 今天我在安装Oracle11gClient时,全部显示成N/A,Oracle无法执行 ...

  6. jdbc 链接池的优化

    package cn.itcast.jdbc.datasourse; import java.sql.Connection;import java.sql.DriverManager;import j ...

  7. Frege-基于JVM的类Haskell纯函数式编程语言

    Frege是一门受Haskell语言启示而设计的纯函数式编程语言.Frege程序会被编译为Java,并执行于JVM上.它与Haskell是如此的类似.以至于有人称它为JVM上的Haskell.取Fre ...

  8. 【BZOJ2132】圈地计划 最小割

    [BZOJ2132]圈地计划 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地. ...

  9. 【分享】自己写的一个可空的DateTimePicker控件-附源码

    最近这段时间在重构以前的一个项目,其中有一项就是要把DateTimePicker控件值可空.大家都知道的DateTimePicker值为DateTime类型,DateTime类型值不能等于Null.但 ...

  10. mvn deploy

    mvn:deploy在整合或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享. 以将ojdbc14传到nexus中的thirdparty为例 一 配置 ...