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




  • 相关阅读:
    BGP deterministic-med & compare-med
    BGP Always-compare-med & Deterministic-med
    BGP实验 MED , Cyrus
    BGP Lab AS-path prepend last-as
    详解C/C++中volatile关键字
    38、hashtable中解决冲突有哪些方法?
    37、STL中unordered_map和map的区别和应用场景
    36、set和map的区别,multimap和multiset的区别
    35、STL中map的实现
    34、STL中set的实现?
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6943412.html
Copyright © 2011-2022 走看看