经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
基于RGB与HSI颜色模型的图像提取法
来源:cnblogs  作者:KenSporger  时间:2019/10/8 9:15:50  对本文有异议

  现实中我们要处理的往往是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仿真测试代码如下:

  1. %RGB分量差提取
  2. imga=imread('flower.jpg');
  3. imgb=imread('soil.jpg');
  4. imga2=uint8(zeros(300,300));
  5. imgb2=uint8(zeros(300,300));
  6. for i=1:300
  7. for j=1:300
  8. r=imga(i,j,1);
  9. g=imga(i,j,2);
  10. if (r>g)
  11. imga2(i,j)=uint8(r-g);
  12. else
  13. imga2(i,j)=0;
  14. end
  15. end
  16. end
  17. for i=1:300
  18. for j=1:300
  19. r=imgb(i,j,1);
  20. g=imgb(i,j,2);
  21. b=imgb(i,j,3);
  22. if 2*uint16(g)>(uint16(r)+uint16(b))
  23. imgb2(i,j)=uint8(2*uint16(g)-uint16(r)-uint16(b));
  24. else
  25. imgb2(i,j)=0;
  26. end
  27. end
  28. end
  29. imga2=imbinarize(imga2,60/255);
  30. imgb2=imbinarize(imgb2,40/255);
  31. subplot(2,2,1);
  32. imshow(imga);
  33. title('原图');
  34. subplot(2,2,2);
  35. imshow(imga2);
  36. title('R-G分量差提取红色部分');
  37. subplot(2,2,3);
  38. imshow(imgb);
  39. title('原图');
  40. subplot(2,2,4);
  41. imshow(imgb2);
  42. title('G-R-B分量差提取绿色部分');
  1. %RGBHSI模型
  2. function myhsvdisplay(file)
  3. rgb=imread(file);
  4. [sizex,sizey,~]=size(rgb);
  5. hsv_v=uint8(zeros(sizex,sizey));
  6. hsv_s=double(zeros(sizex,sizey));
  7. hsv_h=double(zeros(sizex,sizey));
  8. for i=1:sizex
  9. for j=1:sizey
  10. r=rgb(i,j,1);
  11. g=rgb(i,j,2);
  12. b=rgb(i,j,3);
  13. rgb_min=min([r,g,b]);
  14. rgb_max=max([r,g,b]);
  15. hsv_v(i,j)=rgb_max;
  16. hsv_s(i,j)=(double(rgb_max)-double(rgb_min))/double(rgb_max);
  17. if r==rgb_max
  18. hsv_h(i,j)=abs( double(g)-double(b))/(double(rgb_max)-double(rgb_min))/double(3);
  19. elseif g==rgb_max
  20. hsv_h(i,j)=double(1/3)+abs(double(g)-double(b))/(double(rgb_max)-double(rgb_min))/double(3);
  21. else
  22. hsv_h(i,j)=double(2/3)+abs(double(g)-double(b))/(double(rgb_max)-double(rgb_min))/double(3);
  23. end
  24. end
  25. end
  26. subplot(2,2,1);
  27. imshow(rgb);
  28. title('rgb原图');
  29. subplot(2,2,2);
  30. imshow(hsv_v);
  31. title('明度信号');
  32. subplot(2,2,3);
  33. imshow(hsv_s);
  34. title('饱和度信号');
  35. subplot(2,2,4);
  36. imshow(hsv_h);
  37. title('色调信号');
  38. end
  1. %利用饱和度提取
  2. function sbinarize(file)
  3. imga=imread(file);
  4. [~,hsv_s,hsv_v]=rgb2hsv(imga);
  5. sbin=imbinarize(hsv_s,80/255);
  6. vbin=imbinarize(hsv_v,130/255);
  7. subplot(1,3,1);
  8. imshow(imga);
  9. title('原图');
  10. subplot(1,3,2);
  11. imshow(sbin);
  12. title('饱和度提取');
  13. subplot(1,3,3);
  14. imshow(vbin);
  15. title('明度提取');
  16. end

 

 

 

 

   

  

原文链接:http://www.cnblogs.com/kensporger/p/11618520.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号