加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Matlab中编写将彩色图像颜色传递给灰度图像的函数

(2008-07-02 02:18:48)
标签:

matlab

编程技巧

it

教育

分类: Matlab编程

Matlab中编写将彩色图像颜色传递给灰度图像的函数

颜色迁移是将一幅彩色图像的颜色方案传递到另外一幅灰度图像或彩色图像,使后者的图像内容还保持原来的,但颜色却和前者相似的自然感的彩色信息处理技术,在近年来得到了许多领域研究者的青睐。由于许多图像如旧照片、红外热图像、动画图像、一些科学检测图像、计算机生成图像等可能是灰度、单色调图像,为了通过增加颜色提高图像的可用性,符合人的视觉习惯,减少观察者的疲劳度,往往需要颜色迁移技术,下面是利用Matlab编写的一个函数,其可以将一个彩色图像的颜色传递给灰度图像,且具有较强的自然感。

这里的颜色迁移实际上是在lαβ颜色空间进行的,因而需要将彩色图像从RGB颜色空间转换到lαβ颜色空间,颜色迁移完后在进行逆变换。关于颜色空间转换可以参照以前的介绍的“Matlab中图像数据在RGBlαβ颜色空间之间的转换”。

%%%----颜色迁移color transfer

function swgc=swatchcolortransfer(swg,swc,hwin,sizejit)

%swg——灰度图像矩阵

%swc——彩色图像矩阵(三页面24位真彩色图像)

%hwin——滤波窗口的大小

%sizejit——随机采样点数,一般根据彩色图像的大小取50100200等等

swg=double(swg);

swc=double(swc);

sizewin=2*hwin+1;

 

%彩色图像的颜色空间转换(from RGB space to lab

labsw=rgblab(swc,0);

%求均值、方差

ms=zeros(3,2);

ms(1,1)=mean2(labsw(:,:,1));ms(1,2)=std2(labsw(:,:,1));

ms(2,1)=mean2(labsw(:,:,2));ms(2,2)=std2(labsw(:,:,2));

ms(3,1)=mean2(labsw(:,:,3));ms(3,2)=std2(labsw(:,:,3));

 

%数据校正

uc=mean2(labsw(:,:,1));

dc=std2(labsw(:,:,1));

ug=mean2(swg(:,:,1));

dg=std2(swg(:,:,1));

if dg~=0

    labsw(:,:,1)=(labsw(:,:,1)-uc).*(dg/dc)+ug;

end

 

%求颜色转移时的匹配矢量

ucv0=colfilt(labsw(:,:,1),[sizewin,sizewin],'sliding',@mean);

dcv0=colfilt(labsw(:,:,1),[sizewin,sizewin],'sliding',@std);

ugv0=colfilt(swg(:,:,1),[sizewin,sizewin],'sliding',@mean);

dgv0=colfilt(swg(:,:,1),[sizewin,sizewin],'sliding',@std);

 

[mc nc]=size(labsw(:,:,1));

[mg ng]=size(swg(:,:,1));

ucv=ucv0(1+hwin:mc-hwin,1+hwin:nc-hwin);

dcv=dcv0(1+hwin:mc-hwin,1+hwin:nc-hwin);

ugv=ugv0(1+hwin:mg-hwin,1+hwin:ng-hwin);

dgv=dgv0(1+hwin:mg-hwin,1+hwin:ng-hwin);

sw_u=ugv;

sw_d=dgv;

 

labsw=labsw(1+hwin:mc-hwin,1+hwin:nc-hwin,:);

swg=swg(1+hwin:mg-hwin,1+hwin:ng-hwin,:);

 

mc=mc-2*hwin;nc=nc-2*hwin;

mg=mg-2*hwin;ng=ng-2*hwin;

 

% 随机采集颜色像素集

seljitt=zeros(sizejit,5);

for i=1:sizejit

    ra1=uint16(rand(1)*(mc-1)+1);

    ra2=uint16(rand(1)*(nc-1)+1);

    seljitt(i,1:3)=labsw(ra1,ra2,1:3);

    seljitt(i,4)=ucv(ra1,ra2);

    seljitt(i,5)=dcv(ra1,ra2);

end

 

% 匹配与颜色转递

for ii=1:mg

    for jj=1:ng

        minv=100000;

        for i=1:sizejit

            LS=abs(seljitt(i,4)-ugv(ii,jj))+abs(seljitt(i,5)-dgv(ii,jj));

            if LS<minv

                minv=LS;iii=i;

            end

        end

        swg(ii,jj,2:3)=seljitt(iii,2:3);

    end

end

% 颜色空间逆变换(from lab space to RGB

swgc=rgblab(swg(1:mg,1:ng,:),1);

return swgc;

颜色迁移是比较费时间的,可以在上述程序上进一步修改优化出速度更快的程序。为了达到说明效果的目的,使用上述程序时采用的图像不要很大,如64×64128×128,这样程序运行时间就不会太长。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有