zoukankan      html  css  js  c++  java
  • RGB 颜色空间转 HSI 颜色空间的matlab程序实现


    RGB 颜色空间转 HSI 颜色空间的matlab程序实现



    2014.10.20之前的内容有误,这里依据wikipedia更新了算法内容. 算法以wiki为准

    https://en.wikipedia.org/wiki/HSL_and_HSV


    这里demo出 HSI中 S 空间的图像和暗通道图的对照.

    会发现,确实右边到非常暗,这是由于HSV转换的时候对RGB值做了归一化处理,假设打印出归一化处理后的R+G+B值会发现输出图像非常亮(白茫茫一片~)



    下图是取自图像第321列的数据分布,能够看见图像的灰度分布是非常明晰的




    以下给出了我写的转换函数,直接调用就可以.

    %%************************************************************************** 
    % Function writer : EOF
    % code file       : RGB2SHI_Color.m
    % code date       : 2014.10.16
    % Translate RGB into HSI-space
    %
    % Code Description:
    %
    %       If you want to translate a colourful Image which is coded as
    % RGB colour space into HSI space, what you need to do is just input your
    % colour image.
    %
    % This function would return HSI as a matrix [H,S,I].
    %
    %% *************************************************************************
    function [H,S,I] = RGB2SHI_Color(Image)
    
            if size(Image,3) ~= 3
                fprintf('ERROR Imput-Image must be three channel image
    ');
                return;
            end
            
            Height_Image  = size(Image,1);
            Width_Image   = size(Image,2);
            Channel_Image = size(Image,3);
    
            H      = zeros(1,Height_Image * Width_Image);
            H_temp = zeros(1,Height_Image * Width_Image);
            S      = zeros(1,Height_Image * Width_Image);
            I      = zeros(1,Height_Image * Width_Image);
            %% Normalization into (0,1)
            R_temp = double(Image(:,:,1));
            G_temp = double(Image(:,:,2));
            B_temp = double(Image(:,:,3));
    
            R = R_temp./(R_temp + G_temp + B_temp);
            G = G_temp./(R_temp + G_temp + B_temp);
            B = B_temp./(R_temp + G_temp + B_temp);
    
            
            Max_channel = max(max(R,G),B);
            Min_channel = min(min(R,G),B);
            Difference  = Max_channel - Min_channel;
            
            I = (R + G + B)./3;
            
            for row = 1:Height_Image
                for col = 1: Width_Image
                    
                    % In fact , if Difference(row,col) is zero, the H_temp is 
                    % undefine , it means that H_temp(row,col) close to
                    % infinite.
                    if Difference(row,col) == 0
                        H_temp(row,col) = 0;
                    end
                    
                    if Max_channel(row,col) == R(row,col)
                        H_temp(row,col) = mod((G(row,col) - B(row,col)) ...
                            ./Difference(row,col), 6 );
                    end
                    
                    if Max_channel(row,col) == G(row,col)
                        H_temp(row,col) = (B(row,col) - R(row,col)) ...
                            ./Difference(row,col) + 2;
                    end
                    
                    if Max_channel(row,col) == B(row,col)
                        H_temp(row,col) = (B(row,col) - R(row,col)) ...
                            ./Difference(row,col) + 4;
                    end       
                    
                    H(row,col) = H_temp(row,col)*60;
                    
                    if I(row,col) == 0
                        S(row,col) = 0;
                    else
                        S(row,col) = 1 - (Min_channel(row,col)./I(row,col));
                    end
                end
            end
           
    end




  • 相关阅读:
    读书笔记之理想设计的特征
    一些javascript 变量声明的 疑惑
    LINQ 使用方法
    Google MySQL tool releases
    读书笔记之设计的层次
    EF之数据库连接问题The specified named connection is either not found in the configuration, not intended to be used with the Ent
    转载 什么是闭包
    javascript面向对象起步
    Tips
    数据结构在游戏中的应用
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6943412.html
Copyright © 2011-2022 走看看