我正在尝试编写一个程序来获取图像并将其转换为MATLAB中的chromaticity图像。
根据我的理解,要实现色度,您必须从r,g,b
计算R,G,B
:
所以,我已经完成了这个(或至少尝试过它),但它只返回一个黑色图像...
这是我的计划:
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。
答案 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):