Matlab实现给黑白图片上色

                                     Matlab实现给黑白图片上色

今天翻到了爸妈年轻时候的老照片,突然有一中想法如果如何给这些图片上色,使其成为彩色照片;黑白照片上色功能在其他一些专门的图片处理软件就可以简单实现的,比如:Photoshop、ACDSee、Picasa等,但是我还是想如何运用matlab算法给图片上色,难点是给一张图片上什么颜色、什么区域上什么颜色、颜色的深浅问题等等,经过我查阅整理资料得知:将彩色通道进行线性组合形成灰度通道,这是图像处理里面一个常规的做法,在matlab工具箱中有rgb2gray这个函数可以完成。在matlab的文件分享网站,有大牛发布了一个代码可以反过来变换图像。文件要求提供一个灰度图像,以及一个作为相似图片作为调色板,然后 gray2rgb的函数就可以生成的彩色版本图像。

代码

clc
clear
%date:2018-9-12
%author:猪猪侠
subplot(2,2,1)
imshow('zzx1.jpg');
title('原灰度图')
subplot(2,2,2)
imshow('zzx2.jpg');
title('参考彩色图')
colorIm = gray2rgb('zzx1.jpg','zzx2.jpg');
subplot(2,2,3.5)
imshow(colorIm) 
title('匹配颜色')

gray2rgb函数

function R=gray2rgb(img1,img2)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% This Program converts a gray image ro RGB image based on the colors of the destination image. The better the destination image match with the source gray image, the better the coloring will be. The program takes some time  as the searching time is high. You can decrease the searching time by taking only samples from the used color image but quality may decrease. U can use jittered sampling for improving running speed. % 
%  You can use also use the attahed test images, Use the following combinations for better result nature1.jpg(as img1) and nature2.jpg(as img2) or test1.jpg(as img1) and test2.jpg (as img2) %
% Usage: gray2rgb('nature1.jpg','nature2.jpg');  %
%  Authors : Jeny Rajan , Chandrashekar P.S %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% img1 - Source Image  (gray image)   
% img2 - Selected color image for coloring the gray image. 
tic
 clc;
 warning off;
 imt=imread(img1);
 ims=imread(img2);
 [sx sy sz]=size(imt);
 [tx ty tz]=size(ims);
 if sz~=1
     imt=rgb2gray(imt);
 end
 if tz~=3
     disp ('img2 must be a color image (not indexed)');
 else
     imt(:,:,2)=imt(:,:,1);
     imt(:,:,3)=imt(:,:,1);

 % Converting to ycbcr color space
     nspace1=rgb2ycbcr(ims);
     nspace2= rgb2ycbcr(imt);

    ms=double(nspace1(:,:,1));
     mt=double(nspace2(:,:,1));
     m1=max(max(ms));
     m2=min(min(ms));
     m3=max(max(mt));
     m4=min(min(mt));
     d1=m1-m2;
     d2=m3-m4;
 % Normalization
     dx1=ms;
     dx2=mt;
     dx1=(dx1*255)/(255-d1);
     dx2=(dx2*255)/(255-d2);
     [mx,my,mz]=size(dx2);
 %Luminance Comparison
    % disp('Please wait..................');
     for i=1:mx
         for j=1:my
              iy=dx2(i,j);
              tmp=abs(dx1-iy);
              ck=min(min(tmp));
              [r,c] = find(tmp==ck);
              ck=isempty(r);
              if (ck~=1)            
                  nimage(i,j,2)=nspace1(r(1),c(1),2);
                  nimage(i,j,3)=nspace1(r(1),c(1),3);
                  nimage(i,j,1)=nspace2(i,j,1);           
             end
          end
      end
     rslt=ycbcr2rgb(nimage)
     %figure,imshow(uint8(imt));
     %figure,imshow(uint8(rslt));
     R=uint8(rslt);
     toc
 end  


 

代码的处理思路:

函数将灰度图像扩展到三通道(复制通道),然后将两张图像转为yCbCr空间。最后,通过一个二重循环来逐像素生成结果图,缺点是耗时。

发布了53 篇原创文章 · 获赞 174 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/zzx2016zzx/article/details/82656314