www.gusucode.com > mean-shift用于图像分割 Matlab程序 > Ms_segmenter/Rgb_to_luv.m
function Luv_back = Rgb_to_luv (Im_rgb, Type) % takes an image in Rgb coords and returns either a vector or an image % in Luv coords, depending on Type (Image or vector). Vector = shiftdim(Im_rgb, 2); Vector = double(reshape(Vector, [3, size(Im_rgb, 1)*size(Im_rgb, 2)])); Vector_nz = 4096*(sum(Vector, 1) > 0); Vector_z = not(Vector_nz); Vector = max(Vector, [Vector_z; Vector_z; Vector_z]); % to avoid all zero pixels Matrix = [... 0.490 0.310 0.200; ... 0.177 0.812 0.011; ... 0.000 0.010 0.990]; XYZ = Matrix*Vector; % now get a vector in XYZ coords Y0 = 1; % is it true? X0 = 1; Z0 = 1; u0 = 4*X0/(X0+15*Y0+3*Z0); v0 = 9*Y0/(X0+15*Y0+3*Z0); Luv_back = zeros(size(Vector)); Luv_back(1, :) = 25*(100*XYZ(2, :)/Y0).^(0.333)-16; Zeros = zeros(size(Luv_back(1, :))); Luv_back(1, :) = max(Luv_back(1, :), Zeros); u = 4*XYZ(1, :) ./ (XYZ(1, :)+15*XYZ(2, :)+3*XYZ(3, :)); v = 9*XYZ(2, :) ./ (XYZ(1, :)+15*XYZ(2, :)+3*XYZ(3, :)); Luv_back(2, :) = 13*Luv_back(1, :).*(u-u0); Luv_back(2, :) = max(Luv_back(2, :), Zeros); Luv_back(3, :) = 13*Luv_back(1, :).*(v-v0); Luv_back(3, :) = max(Luv_back(3, :), Zeros); Luv_back = min(Luv_back, [Vector_nz; Vector_nz; Vector_nz]); % zeroing out Luv_back = Luv_back/(718.3176/256); if strcmp(Type, 'Image') Luv_back = reshape(Luv_back, [3, size(Im_rgb, 1), size(Im_rgb, 2)]); Luv_back = shiftdim(Luv_back, 1); end