基於RGB與HSI顏色模型的圖像提取法


  現實中我們要處理的往往是RGB彩色圖像。對其主要通過HSI轉換、分量色差等技術來提出目標。

 

RGB分量灰度化:

  RGB可以分為R、G、B三分量。當R=G=B即為灰度圖像,很多時候為了方便,會直接利用某個分量來進行灰度化,如下圖所示:

    上圖中R分量下紅色部分明顯比其他兩幅更偏白;同樣地G分量草地較淡,B分量天空較淡。其他部分如灰黑色馬路則相差不多。實際中,我們可以根據

  需求有選擇地選擇分量。

 

RGB分量差灰度化:

  有時候我們的要求是從圖像中提取某種顏色區域,那么最簡單的方法就是采用RGB色差。

  例如在花束中提取紅色的花瓣,就可以采用R-G分量差(目標為紅色,干擾為G分量),或者,在土壤表面提取綠色秧苗,可以采用G-R-B分量差(G占2份,土壤可能

  存在R,B分量干擾),下圖為提取結果:

  

  如果遇到更復雜的情況,可以根據目標顏色與干擾顏色設計合適的分量差。

  

 

HSI分量灰度化:

    H、S、I分別表示色調、飽和度、明度。色調指日常所說的顏色(紅,白,黑等),飽和度則表示顏色的鮮艷程度,值越大越鮮艷,明度則是顏色的明亮

  程度。這三種屬性可以用兩個椎體表示,其中明度是豎直中心軸,在豎直方向上,明度不同;每個明度對應一個橫截面,用極坐標表示H,S,H為角度,S為模長。

  HSI模型如圖所示:

  

 

  我們可以將RGB轉為HSI,相關公式有很多種,各有特點,下面介紹其中一種:

    rgb_min=min(r,g,b)

    rgb_max=max(r,g,b)

    I=rgb_max

    S=(rgb_max-rgb_min)/rgb_max

    if r==rgb_max

      H=abs(g-b)/(rgb_max-rgb_min)/3

    if g==rgb_max

      H=1/3+abs(r-b)/(rgb_max-rgb_min)/3

    if  b==rgb_max

 

      H=2/3+abs(r-g)/(rgb_max-rgb_min)/3

 

  如此計算所得的H范圍為[0,1),S范圍為[0,1),I范圍[0,255]。HSI分量灰度圖如下:

  

  明度分量與一般灰度化效果差不多(可能灰度化可能是基於明度的),有時候利用飽和度與色調灰度號的圖像進行提取會便利很多,如下圖是基於飽和度的二值提取

  (一般如果要基於顏色提取的化采用RGB分量色差比較好,畢竟如果要獲取較精准的飽和度信息,所用公式會比上面的復雜):

  

  由於背景的飽和度較低,而目標飽和度高,而且目標由多種顏色組成,這樣如果直接基於明度的灰度化不可能提取到整個花束,而通過飽和度提取的效果就非常棒。

  另外,也可以將HSI組合起來使用,使得特征更明顯,例如可以用飽和度與色調消除紅眼現象,具體基於HSI的算法這里就不探究了!

 

 

以上相關matlab仿真測試代碼如下:

%RGB分量差提取
imga=imread('flower.jpg');
imgb=imread('soil.jpg');
imga2=uint8(zeros(300,300));
imgb2=uint8(zeros(300,300));
for i=1:300
    for j=1:300
        r=imga(i,j,1);
        g=imga(i,j,2);
        if (r>g)
            imga2(i,j)=uint8(r-g);
        else
            imga2(i,j)=0;
        end
    end
end

for i=1:300
    for j=1:300
        r=imgb(i,j,1);
        g=imgb(i,j,2);
        b=imgb(i,j,3);
        if 2*uint16(g)>(uint16(r)+uint16(b))
            imgb2(i,j)=uint8(2*uint16(g)-uint16(r)-uint16(b));
        else
            imgb2(i,j)=0;
        end
    end
end

imga2=imbinarize(imga2,60/255);
imgb2=imbinarize(imgb2,40/255);

subplot(2,2,1);
imshow(imga);
title('原圖');
subplot(2,2,2);
imshow(imga2);
title('R-G分量差提取紅色部分');

subplot(2,2,3);
imshow(imgb);
title('原圖');
subplot(2,2,4);
imshow(imgb2);
title('G-R-B分量差提取綠色部分');
%RGB轉HSI模型
function myhsvdisplay(file)
    rgb=imread(file);
    [sizex,sizey,~]=size(rgb);
    
    hsv_v=uint8(zeros(sizex,sizey));
    hsv_s=double(zeros(sizex,sizey));
    hsv_h=double(zeros(sizex,sizey));
    for i=1:sizex
        for j=1:sizey
            r=rgb(i,j,1);
            g=rgb(i,j,2);
            b=rgb(i,j,3);
            rgb_min=min([r,g,b]);
            rgb_max=max([r,g,b]);
            hsv_v(i,j)=rgb_max;
            hsv_s(i,j)=(double(rgb_max)-double(rgb_min))/double(rgb_max);
            if r==rgb_max
                hsv_h(i,j)=abs( double(g)-double(b))/(double(rgb_max)-double(rgb_min))/double(3);
            elseif g==rgb_max
                hsv_h(i,j)=double(1/3)+abs(double(g)-double(b))/(double(rgb_max)-double(rgb_min))/double(3);
            else
                hsv_h(i,j)=double(2/3)+abs(double(g)-double(b))/(double(rgb_max)-double(rgb_min))/double(3);
            end      
        end
    end
   
    subplot(2,2,1);
    imshow(rgb);
    title('rgb原圖');
    
    subplot(2,2,2);
    imshow(hsv_v);
    title('明度信號');
    
    subplot(2,2,3);
    imshow(hsv_s);
    title('飽和度信號');
    
    subplot(2,2,4);
    imshow(hsv_h);
    title('色調信號');
end
%利用飽和度提取
function sbinarize(file)
   imga=imread(file);
   [~,hsv_s,hsv_v]=rgb2hsv(imga);
   sbin=imbinarize(hsv_s,80/255);
   vbin=imbinarize(hsv_v,130/255);
    subplot(1,3,1);
    imshow(imga);
    title('原圖');
    subplot(1,3,2);
    imshow(sbin);
    title('飽和度提取');
    subplot(1,3,3);
    imshow(vbin);
    title('明度提取');
end

 

 

 

 

   

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM