RGB to HSV

The R,G,B values are divided by 255 to change the range from 0..255 to 0..1:

R' = R/255

G' = G/255

B' = B/255

Cmax = max(R', G', B')

Cmin = min(R', G', B')

Δ = Cmax - Cmin

Hue calculation:

Saturation calculation:

Value calculation:

V = Cmax

HSV to RGB

When 0 ≤ H < 360, 0 ≤ S ≤ 1 and 0 ≤ V ≤ 1:

C = V × S

X = C × (1 - |(H/ 60º) mod 2 - 1|)

m = V - C

(R,G,B) = (R'+m, G'+m, B'+m)

算法参考来源:http://www.rapidtables.com/convert/color/hsv-to-rgb.htm

CODE:

function  [H,S,V]=RgbToHsv(Image_Input)



Image_Input=double(Image_Input)/255;

R_Input=Image_Input(:,:,1);

G_Input=Image_Input(:,:,2);

B_Input=Image_Input(:,:,3);

[heigth,width]=size(R_Input);

S(1:heigth,1:width)=0;

H(1:heigth,1:width)=0;

V(1:heigth,1:width)=0;

for i=1:heigth

    for j=1:width

        temp=[R_Input(i,j),G_Input(i,j),B_Input(i,j)];

        Max_value=max(temp);

        Min_value=min(temp);

        C_value=Max_value-Min_value;

        V(i,j)=Max_value;

        if(C_value==0)

            S(i,j)=0;

        else

            S(i,j)=C_value/Max_value;

        end

        X=R_Input(i,j);

        Y=G_Input(i,j);

        Z=B_Input(i,j);

        if(C_value==0)

            continue;

        end

        if(Max_value==X)

            H(i,j)=mod((Y-Z)/C_value,6);

        elseif(Max_value==Y)

            H(i,j)=(Z-X)/C_value+2;

        else

            H(i,j)=(X-Y)/C_value+4;

        end

        H(i,j)=H(i,j)/6;

    end

end

function Image_out=HsvToRgb(H,S,V)

%%  H(0,1),S(0,1),L(0,1)

[height,width]=size(H);

R(1:height,1:width)=0;

G(1:height,1:width)=0;

B(1:height,1:width)=0;

for i=1:height

    for j=1:width

        C=V(i,j)*S(i,j);

        X=C*(1-abs(mod(H(i,j)*6,2)-1));

        m=V(i,j)-C;

        temp=floor(H(i,j)*6+1);

        switch(temp)

            case 1

                R(i,j)=C+m;

                G(i,j)=X+m;

                B(i,j)=m;

            case 2

                R(i,j)=X+m;

                G(i,j)=C+m;

                B(i,j)=m;

            case 3

                R(i,j)=m;

                G(i,j)=C+m;

                B(i,j)=X+m;

            case 4

                R(i,j)=m;

                G(i,j)=X+m;

                B(i,j)=C+m;

            case 5

                R(i,j)=X+m;

                G(i,j)=m;

                B(i,j)=C+m;

            case 6

                R(i,j)=C+m;

                G(i,j)=m;

                B(i,j)=X+m;

        end

    end

end



Image_out(:,:,1)=R;

Image_out(:,:,2)=G;

Image_out(:,:,3)=B;

最新文章

  1. CSS HTML元素布局及Display属性
  2. win 安装mysql
  3. jQuery Mobile 网格布局
  4. Computer Vision 学习 -- 图像存储格式
  5. 我写的一个ExcelHelper通用类,可用于读取或生成数据
  6. 使用git Rebase让历史变得清晰
  7. Bugs及解决方案列表
  8. [转]BeagleBone Black USB一线通(2)
  9. git 克隆本地仓库
  10. struts2中根对象以及ognl .
  11. 判断是否是IE(包含IE11)
  12. 【USACO】股票市场
  13. python map filter reduce的优化使用
  14. GCD nyoj 1007 (欧拉函数+欧几里得)
  15. [转] Firewall and network filtering in libvirt
  16. [转]Mysql中的SQL优化与执行计划
  17. (转)Secondary NameNode的作用
  18. java.lang.NullPointerException - 如何处理空指针异常
  19. 自定义UITabbarController控制器
  20. 【LeetCode43】 Multiply Strings

热门文章

  1. Findbugs异常总汇
  2. SQLite AND/OR 运算符(http://www.w3cschool.cc/sqlite/sqlite-and-or-clauses.html)
  3. BeanUtils 读取数据
  4. Dialog样式的Activity
  5. VMware虚拟化解决方案】如何选择虚拟化产品
  6. Swift基础之Animation动画研究
  7. 02_MyBatis项目结构,所需jar包,ehcache.xml配置,log4j.properties,sqlMapConfig.xml配置,SqlMapGenerator.xml配置
  8. Java:使用匿名内部类在方法内部定义并启动线程
  9. 从浏览器直接转跳到APP具体页面---(魔窗)MagicWindow使用教程
  10. (六十九)使用block进行消息传递