机器学习:Colorization using Optimization

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

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

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

J(U)=rU(r)sN(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);

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: 色彩优化是一种利用优化算法对黑白图像进行自动上色的技术。该技术可以通过对图像中的像素进行分析和处理,自动为其添加适当的颜色,从而使黑白图像变得更加生动、真实。这种技术在计算机视觉、图像处理等领域有着广泛的应用。 ### 回答2: 色彩恢复是一种通过优化算法将黑白图像转换为彩色图像的技术。它是计算机视觉领域的重要研究方向之一。传统的图像处理方法主要依赖人工干预来实现,而基于优化的色彩恢复利用机器学习和计算机视觉的技术进行自动化处理。 基于优化的色彩恢复技术一般分为两个主要步骤:色彩传递和色彩生成。首先,通过色彩传递,算法通过分析已有彩色图像和黑白图像的对应关系来传递色彩信息。这可以通过匹配像素或者更复杂的方法实现。接下来,利用优化算法进行色彩生成,以确保生成的彩色图像与原始彩色图像尽可能相似。这些优化算法可以使用最小二乘法、最大似然估计或其他适用的数学模型来定义目标函数,并通过在参数空间中搜索来最小化目标函数。 色彩恢复的优化算法存在一些挑战。首先,黑白图像提供的信息有限,因此算法需要对图像进行适当的推测和填充。其次,颜色的感知是主观的,因此算法需要在保留图像细节的同时提供可接受的结果。此外,算法的效率也是一个重要的考虑因素,因为处理大型图像需要较长的时间。 虽然色彩恢复领域仍然存在一些挑战,但优化技术已经取得了一定的进展。它已经成功应用于许多应用领域,如照片修复、电影和动画的彩色化等。随着深度学习等技术的快速发展,我们可以期待色彩恢复技术在未来会有更广泛的应用。 ### 回答3: 色彩优化是一种通过优化算法为黑白或灰度图像增加色彩的技术。它的目标是将颜色添加到图像中,以使其看起来更真实、更有生气。色彩优化通常分为两个主要步骤:预处理和优化。 在预处理阶段,首先需要将黑白或灰度图像转换为带有彩色图像的特征空间。这可以通过使用计算机视觉和机器学习算法来实现。其中一种常见的方法是使用卷积神经网络(CNN)对图像进行训练,从而学习出图像的特征并将其连接到真实的彩色图像。 在优化阶段,算法通过最小化颜色误差函数来为图像添加色彩。颜色误差函数衡量了生成的彩色图像与真实彩色图像之间的差异。通过调整图像中的像素值来减小误差函数,优化算法将图像从黑白或灰度转变为彩色。一种常见的优化方法是使用梯度下降算法,以逐步改变像素值,直到误差最小化为止。 色彩优化可以应用于各种领域,例如历史照片复原、电影和视频修复、艺术创作等。通过为这些图像增加色彩,我们可以还原历史照片的原貌,使电影和视频更加逼真,以及为艺术家提供更多的创作想象空间。 然而,色彩优化也有一些挑战和限制。一方面,算法需要拥有足够的训练数据和可靠的特征提取模型,以便为图像正确地赋予色彩。另一方面,对于某些图像,特别是低质量的图像,色彩优化可能会产生不自然或不准确的结果。因此,我们需要不断改进算法和提升训练模型,以提高色彩优化的效果。 综上所述,色彩优化是一种通过优化算法为黑白或灰度图像添加色彩的技术。它通过预处理和优化来实现,可以广泛应用于不同领域,并有着不同程度的挑战和限制。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值