将图像转换为色度图像

时间:2014-02-11 20:57:19

标签: matlab image-processing

我正在尝试编写一个程序来获取图像并将其转换为MATLAB中的chromaticity图像。

根据我的理解,要实现色度,您必须从r,g,b计算R,G,B

equations

所以,我已经完成了这个(或至少尝试过它),但它只返回一个黑色图像...

这是我的计划:

    img = double(imread('ref_images/foliage.jpg'));
    %temp
    chrom_Img = zeros(size(img, 1), size(img, 2));

    %split channels
    R_ = img(:,:,1);
    G_ = img(:,:,2);
    B_ = img(:,:,3);

    %sum RGB channels (R+G+B)
    s_RGB = R_ + G_ + B_;

    %calc r g b with r = R/sum etc
    r_ = R_./s_RGB;
    g_ = G_./s_RGB;
    b_ = B_./s_RGB;

    %assign to chrom_Img
    %chrom_Img = cat(3, r_, g_, b_); %also tried this
    chrom_Img(:,:,1) = r_;
    chrom_Img(:,:,2) = g_;
    chrom_Img(:,:,3) = b_;

我发现错误或实施的错误是什么?

要查看示例图片,请参阅here

1 个答案:

答案 0 :(得分:4)

您的问题是数据类型。处理整数时,任何小于1的分数都为零:

>> uint8(10)/uint8(100)
ans =
    0

当你r_ = R_./s_RGB;时,一切都变为零。

此外,您可以执行以下操作:

,而不是手动求和(s_RGB = R_ + G_ + B_;
s_RGB = sum(double(img),3);

这将总结第三个维度。

img转换为预先加倍,它应该可以正常工作:

chrom_Img = bsxfun(@rdivide,double(img),sum(double(img),3));

结果(基于this image):

enter image description here