将RGB转换为HSV

4

我希望将RGB值转换为HSV值。但是如果我将9除以28,Octave会计算出0。有人能解释一下原因吗?

function [hsv] = RGBtoHSV()
    im = imread('picture.png'); 
    R = im(:,:,1); 
    G = im(:,:,2); 
    B = im(:,:,3);

    len = length(R); % R, G, B should have the same length
    for i = 1:len
        MAX = max([R(i),G(i),B(i)]);
        MIN = min([R(i),G(i),B(i)]);
        S = 0;
        if MAX == MIN
            H = 0;
        elseif MAX == R(i)
            disp(G(i) - B(i)); % 9 
            disp(MAX - MIN);  % 28
            H = 0.6 * ( 0 + ( (G(i) - B(i)) / MAX - MIN) ); % 0
            disp(H) % why i get 0 if try to calculate ( 0 + ( (G(i) - B(i)) / MAX - MIN)?
        ....
            end
        return;
    end
endfunction

RGBtoHSV()

Chris :D
克里斯:D

Octave有整数和实数类型吗?当使用整数时,“9/28 = 0”是正确的。 - Jongware
没有问题,disp(9/28)可以正常工作。解决方案是0.32143 - user2372976
2个回答

4

你需要将图像转换为Double类型,方法如下:

im = double(imread('picture.png'));

这将解决您的问题,因为图像类型是UINT8

2
你可以使用 Octave 内置的 rgb2hsv 函数,而不是编写自己的函数。
im_rgb = imread ("picture.png"); 
im_hsv = rgb2hsv (im_rgb);

如果这是一项练习,那么我建议您查看其源代码,在Octave提示符下输入type rgb2hsv,并查看其实现方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接