【Matlab】【Color】matlab中一个“全能”颜色空间转换的程序

matlab中一个“全能”颜色空间转换的程序
转载之: http://www.bfcat.com/

"Colorspace Transformations"是一个matlab程序,可以完成多种颜色空间互相的转换,不用局限于matlab自带的RGB2Lab之类。

这个程序支持的颜色空间如下:

'RGB'              sRGB IEC 61966-2-1
'YCbCr'            Luma + Chroma ("digitized" version of Y'PbPr)
'JPEG-YCbCr'       Luma + Chroma space used in JFIF JPEG
'YDbDr'            SECAM Y'DbDr Luma + Chroma
'YPbPr'            Luma (ITU-R BT.601) + Chroma
'YUV'              NTSC PAL Y'UV Luma + Chroma
'YIQ'              NTSC Y'IQ Luma + Chroma
'HSV' or 'HSB'     Hue Saturation Value/Brightness
'HSL' or 'HLS'     Hue Saturation Luminance
'HSI'              Hue Saturation Intensity
'XYZ'              CIE 1931 XYZ
'Lab'              CIE 1976 L*a*b* (CIELAB)
'Luv'              CIE L*u*v* (CIELUV)
'LCH'              CIE L*C*H* (CIELCH)
'CAT02 LMS'        CIE CAT02 LMS

这种转换有什么用呢?其中一个重要的应用就是在不同的颜色空间里,图像分割问题会变得更简单。例如下面这幅图,我们想分割出中间那个黄色的辣椒

我们试着在YCbCr空间中的Cb通道进行,也就是下面这幅图

进行如下操作

mask = ~im2bw(img,0.24);
cc = bwconncomp(mask);
stats = regionprops(cc,'Area');
A = [stats.Area];
[~,biggest] = max(A);
mask(labelmatrix(cc)~=biggest) = 0;
mask = imfill(mask,'holes');
imshow('peppers.png')
showMaskAsOverlay(0.7,mask,'c');

结果完美的分割出了我们想要的目标。

showMaskAsOverlay是一个模板叠加显示的函数。

使用下面的程序,我们可以浏览这幅图像在各个颜色空间的样子

cs = {'RGB','YCbCr','JPEG-YCbCr','YDbDr','YPbPr','YUV',...
'YIQ','HSV','HSL','HSI',...
'XYZ','Lab','Luv','LCH','CAT02 LMS'};
peppers = imread('peppers.png');
figure('color','w');
ax = tight_subplot(numel(cs),4);
ind = 1;
for ii = 1:numel(cs)
    newim = colorspace(['->' cs{ii}],peppers);
    if max(newim(:)) > 1
        newim = newim/max(newim(:));
    end
    axes(ax(ind));
    imshow(newim,[]);title(cs{ii});
    for jj = 1:3
        ind = ind+1;
        axes(ax(ind));
        imshow(newim(:,:,jj),[]);title(sprintf('%s(:,:,%i)',cs{ii},jj));
    end
    ind = ind+1;
end
expandAxes(ax)

这为我们提供了很多可以在图像分割中利用的特征。

你可能感兴趣的:(【matlab】,【Color】)