2014-02-11 209 views
1

我正试图编写一个程序,该程序将图像转换为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

回答

4

你的问题是数据类型。当与整数处理任何分数小于一个是零:

>> 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

+2

真棒。感谢发布。很好的答案。我很高兴这很简单。再次感谢:D – Reanimation