十二、从 RGB 到 HSV 的转换详细介绍

从RGB 到 HSV 的转换详细介绍

1.RGB

       RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和,越混合亮度越高,即加法混合。

        红、绿、蓝三个颜色通道每种色各分为256阶亮度,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。当三色灰度数值相同时,产生不同灰度值的灰色调,即三色灰度都为0时,是最暗的黑色调;三色灰度都为255时,是最亮的白色调。

        在电脑中,RGB的所谓“多少”就是指亮度,并使用整数来表示。通常情况下,RGB各有256级亮度,用数字表示为从0、1、2...直到255。注意虽然数字最高是255,但0也是数值之一,因此共256级。

图1.1 RGB

2.HSV

        HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛,这个模型中颜色的参数分别是:色调(H, Hue),饱和度(S,Saturation),明度(V, Value)。

色调H

        用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;

饱和度S

        饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。

明度V

        明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

                    

图2.1 HSV

2.1应用openCV中HSV取值范围说明

我们需要注意的在不同应用场景中,HSV取值范围是不尽相同的。

1.PS软件时,H取值范围是0-360,S取值范围是(0%-100%),V取值范围是(0%-100%)。

2.利用openCV中cvSplit函数的在选择图像IPL_DEPTH_32F类型时,H取值范围是0-360,S取值范围是0-1(0%-100%),V取值范围是0-1(0%-100%)。

3.利用openCV中cvSplit函数的在选择图像IPL_DEPTH_8UC类型时,H取值范围是0-180,S取值范围是0-255,V取值范围是0-255。

3.RGB转HSV

3.1公式


3.2代码

测试样例1
    
     
     

    
     
     
  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include "cxcore.h"
  4. /*--------------copyright-hanshanbuleng--------------------*/
  5. // 将色调H的取值范围转换到0~180之间
  6. int main()
  7. {
  8. float H,S,V,H1,S1,V1;
  9. IplImage *src = cvLoadImage( "F:\\vs2010program\\RGB_HSV\\study_test\\2.jpg", 1);
  10. IplImage *hsv_img = cvCreateImage(cvGetSize(src), 8 , 3);
  11. IplImage *h_img = cvCreateImage(cvGetSize(src), 8, 1);
  12. IplImage *s_img = cvCreateImage(cvGetSize(src), 8, 1);
  13. IplImage *v_img = cvCreateImage(cvGetSize(src), 8, 1);
  14. cvCvtColor(src, hsv_img, CV_BGR2HSV);
  15. cvSplit(hsv_img, h_img, s_img, v_img, NULL);
  16. for( int y = 0; y < hsv_img->height; y++){
  17. for( int x = 0; x < hsv_img->width; x++)
  18. {
  19. H1 = cvGetReal2D(h_img, y, x);
  20. S1 = cvGetReal2D(s_img, y, x);
  21. V1 = cvGetReal2D(v_img, y, x);
  22. //地址法
  23. H = (uchar)h_img->imageData[y*h_img->widthStep + x*h_img->nChannels];
  24. S = (uchar)s_img->imageData[y*s_img->widthStep + x*s_img->nChannels];
  25. V = (uchar)v_img->imageData[y*v_img->widthStep + x*v_img->nChannels];
  26. printf( "H:%f S:%f V:%f \n",H,S,V);
  27. }
  28. }
  29. cvNamedWindow( "hsv_img", 0); //HSV图
  30. cvShowImage( "hsv_img", hsv_img);
  31. cvNamedWindow( "h_img", 0); //H通道
  32. cvShowImage( "h_img", h_img);
  33. cvNamedWindow( "s_img", 0); //S通道
  34. cvShowImage( "s_img", s_img);
  35. cvNamedWindow( "v_img", 0); //V通道
  36. cvShowImage( "v_img", v_img);
  37. cvWaitKey( 0);
  38. cvReleaseImage(&hsv_img);
  39. cvReleaseImage(&h_img);
  40. cvReleaseImage(&s_img);
  41. cvReleaseImage(&v_img);
  42. cvDestroyWindow( "hsv_img");
  43. cvDestroyWindow( "h_img");
  44. cvDestroyWindow( "s_img");
  45. cvDestroyWindow( "v_img");
  46. return 0;
  47. }
测试样例2
    
     
     

    
     
     
  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include "cxcore.h"
  4. /*---------------copyright-hanshanbuleng-------------
  5. 问题描述:
  6. 用cvShowImage显示32bits float(IPL_DEPTH_32F)型单通道灰度图像时就出了问题,
  7. 图像只有黑白两种颜色,没有灰色的,出现了严重失真,这就是没有正确显示;
  8. 问题原因:
  9. 如果图像是32位float型,cvShowImage会把像素值乘以255然后再与[0,255]的colormap结合起来显示图像,
  10. 也就是说,原来32位folat型图像中值为0的像素被显示成黑色,值大于或等于1的像素被显示成白色。
  11. ---------------------------------------------------*/
  12. //此时H的范围只能在0~360之间
  13. int main()
  14. {
  15. float H,S,V,H1,S1,V1;
  16. IplImage *src = cvLoadImage( "F:\\vs2010program\\RGB_HSV\\study_test\\2.jpg", 1);
  17. IplImage *hsv_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F , 3);
  18. cvConvertScale(src, hsv_img, 1.0, 0.0);
  19. IplImage *hsv_img1 = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F , 3);
  20. IplImage *h_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
  21. IplImage *s_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
  22. IplImage *v_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
  23. IplImage *h_img1 = cvCreateImage(cvGetSize(src), 8, 1);
  24. IplImage *s_img1 = cvCreateImage(cvGetSize(src), 8, 1);
  25. IplImage *v_img1 = cvCreateImage(cvGetSize(src), 8, 1);
  26. cvCvtColor(hsv_img, hsv_img1, CV_BGR2HSV);
  27. cvSplit(hsv_img1, h_img, s_img, v_img, NULL);
  28. for( int y = 0; y < hsv_img->height; y++){
  29. for( int x = 0; x < hsv_img->width; x++)
  30. {
  31. H1 = cvGetReal2D(h_img, y, x); //0-360
  32. S1 = cvGetReal2D(s_img, y, x); //0-1
  33. V1 = cvGetReal2D(v_img, y, x); //0-255
  34. 地址法 还是有问题 待研究
  35. //H = (double)h_img->imageData[y*h_img->widthStep + x*h_img->nChannels];
  36. //S = s_img->imageData[y*s_img->widthStep + x*s_img->nChannels];
  37. //V = v_img->imageData[y*v_img->widthStep + x*v_img->nChannels];
  38. printf( "H:%f S:%f V:%f \n",H1,S1,V1);
  39. }
  40. }
  41. cvCvtScale(v_img,h_img1, 255.0/ 360.0);
  42. cvNamedWindow( "hsv_img"); //HSV图
  43. cvShowImage( "hsv_img", hsv_img);
  44. cvNamedWindow( "h_img"); //H通道 0-360 显示不正常
  45. cvShowImage( "h_img", h_img);
  46. cvNamedWindow( "s_img"); //S通道 0-1
  47. cvShowImage( "s_img", s_img);
  48. cvNamedWindow( "h_img1"); //V通道 0-255
  49. cvShowImage( "h_img1", h_img1);
  50. cvNamedWindow( "v_img");
  51. cvShowImage( "v_img", v_img);
  52. cvWaitKey( 0);
  53. cvReleaseImage(&hsv_img);
  54. cvReleaseImage(&h_img);
  55. cvReleaseImage(&s_img);
  56. cvReleaseImage(&v_img);
  57. cvDestroyWindow( "hsv_img");
  58. cvDestroyWindow( "h_img");
  59. cvDestroyWindow( "s_img");
  60. cvDestroyWindow( "v_img");
  61. return 0;
  62. }
测试样例3
    
     
     

    
     
     
  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include "cxcore.h"
  4. /*--------------copyright-hanshanbuleng--------------------*/
  5. //此时H,S,V的范围均在0~255之间
  6. int main()
  7. {
  8. float H,S,V,H1,S1,V1;
  9. IplImage *src = cvLoadImage( "F:\\vs2010program\\RGB_HSV\\study_test\\2.jpg", 1);
  10. IplImage *hsv_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F , 3);
  11. cvConvertScale(src, hsv_img, 1.0, 0.0);
  12. IplImage *hsv_img1 = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F , 3);
  13. IplImage *h_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
  14. IplImage *s_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
  15. IplImage *v_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
  16. IplImage *h = cvCreateImage(cvGetSize(src), 8, 1);
  17. IplImage *s = cvCreateImage(cvGetSize(src), 8, 1);
  18. IplImage *v = cvCreateImage(cvGetSize(src), 8, 1);
  19. cvCvtColor(hsv_img, hsv_img1, CV_BGR2HSV);
  20. cvSplit(hsv_img1, h_img, s_img, v_img, NULL);
  21. //转换表示范围
  22. cvConvertScale(h_img, h, ( 1.0/ 360)* 255, 0.0);
  23. cvConvertScale(s_img, s, 255.0, 0.0);
  24. cvConvertScale(v_img, v, 1.0, 0.0);
  25. for( int y = 0; y < hsv_img->height; y++){
  26. for( int x = 0; x < hsv_img->width; x++)
  27. {
  28. //转换后的h_img,s_img,v_img 取值查看
  29. /*----------------------------------*/
  30. //转换后的h,s,v 取值查看
  31. // H1 = cvGetReal2D(h_img, y, x);
  32. // S1 = cvGetReal2D(s_img, y, x);
  33. // V1 = cvGetReal2D(v_img, y, x);
  34. //
  35. // //地址法 对比
  36. // H = (double)h_img->imageData[y*h_img->widthStep + x*h_img->nChannels];
  37. // S = (double)s_img->imageData[y*s_img->widthStep + x*s_img->nChannels];
  38. // V = v_img->imageData[y*v_img->widthStep + x*v_img->nChannels];
  39. /*----------------------------------*/
  40. //转换后的h,s,v 取值查看
  41. /*----------------------------------*/
  42. H1 = cvGetReal2D(h, y, x);
  43. S1 = cvGetReal2D(s, y, x);
  44. V1 = cvGetReal2D(v, y, x);
  45. //地址法 对比
  46. H = (uchar)h->imageData[y*h->widthStep + x*h->nChannels];
  47. S = (uchar)s->imageData[y*s->widthStep + x*s->nChannels];
  48. V = (uchar)v->imageData[y*s->widthStep + x*s->nChannels];
  49. /*----------------------------------*/
  50. printf( "H:%f S:%f V:%f \n",H,S,V);
  51. }
  52. }
  53. cvNamedWindow( "hsv_img", 0); //HSV图
  54. cvShowImage( "hsv_img", hsv_img);
  55. cvNamedWindow( "h_img", 0); //H通道
  56. cvShowImage( "h_img", h_img);
  57. cvNamedWindow( "s_img", 0); //S通道
  58. cvShowImage( "s_img", s_img);
  59. cvNamedWindow( "v_img", 0); //V通道
  60. cvShowImage( "v_img", v_img);
  61. cvWaitKey( 0);
  62. cvReleaseImage(&hsv_img);
  63. cvReleaseImage(&h_img);
  64. cvReleaseImage(&s_img);
  65. cvReleaseImage(&v_img);
  66. cvDestroyWindow( "hsv_img");
  67. cvDestroyWindow( "h_img");
  68. cvDestroyWindow( "s_img");
  69. cvDestroyWindow( "v_img");
  70. return 0;
  71. }
 
    
     
     

4.引申—本实例使用opencv函数简介

函数介绍百度一下就可以,在此我只是简单说明一下

cvLoadImage() //加载图片

cvCreateImage()//创建图片大小

cvCvtColor()  //空间转换

cvSplit()     //分离不同通道

cvCvtScale()  //调整比例

cvNamedWindow()//创建图像显示窗口

cvReleaseImage()//释放创建的图片

cvWaitKey()    //等待

cvDestroyWindow()//销毁窗口


5.参考链接

https://blog.csdn.net/yangdashi888/article/details/53782481

https://blog.csdn.net/zhupananhui/article/details/21157541

https://baike.baidu.com/item/HSV/547122

 



从RGB 到 HSV 的转换详细介绍

1.RGB

       RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和,越混合亮度越高,即加法混合。

        红、绿、蓝三个颜色通道每种色各分为256阶亮度,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。当三色灰度数值相同时,产生不同灰度值的灰色调,即三色灰度都为0时,是最暗的黑色调;三色灰度都为255时,是最亮的白色调。

        在电脑中,RGB的所谓“多少”就是指亮度,并使用整数来表示。通常情况下,RGB各有256级亮度,用数字表示为从0、1、2...直到255。注意虽然数字最高是255,但0也是数值之一,因此共256级。

图1.1 RGB

2.HSV

        HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛,这个模型中颜色的参数分别是:色调(H, Hue),饱和度(S,Saturation),明度(V, Value)。

色调H

        用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;

饱和度S

        饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。

明度V

        明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

                    

图2.1 HSV

2.1应用openCV中HSV取值范围说明

我们需要注意的在不同应用场景中,HSV取值范围是不尽相同的。

1.PS软件时,H取值范围是0-360,S取值范围是(0%-100%),V取值范围是(0%-100%)。

2.利用openCV中cvSplit函数的在选择图像IPL_DEPTH_32F类型时,H取值范围是0-360,S取值范围是0-1(0%-100%),V取值范围是0-1(0%-100%)。

3.利用openCV中cvSplit函数的在选择图像IPL_DEPTH_8UC类型时,H取值范围是0-180,S取值范围是0-255,V取值范围是0-255。

3.RGB转HSV

3.1公式


3.2代码

测试样例1
    
   
   

    
   
   
  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include "cxcore.h"
  4. /*--------------copyright-hanshanbuleng--------------------*/
  5. // 将色调H的取值范围转换到0~180之间
  6. int main()
  7. {
  8. float H,S,V,H1,S1,V1;
  9. IplImage *src = cvLoadImage( "F:\\vs2010program\\RGB_HSV\\study_test\\2.jpg", 1);
  10. IplImage *hsv_img = cvCreateImage(cvGetSize(src), 8 , 3);
  11. IplImage *h_img = cvCreateImage(cvGetSize(src), 8, 1);
  12. IplImage *s_img = cvCreateImage(cvGetSize(src), 8, 1);
  13. IplImage *v_img = cvCreateImage(cvGetSize(src), 8, 1);
  14. cvCvtColor(src, hsv_img, CV_BGR2HSV);
  15. cvSplit(hsv_img, h_img, s_img, v_img, NULL);
  16. for( int y = 0; y < hsv_img->height; y++){
  17. for( int x = 0; x < hsv_img->width; x++)
  18. {
  19. H1 = cvGetReal2D(h_img, y, x);
  20. S1 = cvGetReal2D(s_img, y, x);
  21. V1 = cvGetReal2D(v_img, y, x);
  22. //地址法
  23. H = (uchar)h_img->imageData[y*h_img->widthStep + x*h_img->nChannels];
  24. S = (uchar)s_img->imageData[y*s_img->widthStep + x*s_img->nChannels];
  25. V = (uchar)v_img->imageData[y*v_img->widthStep + x*v_img->nChannels];
  26. printf( "H:%f S:%f V:%f \n",H,S,V);
  27. }
  28. }
  29. cvNamedWindow( "hsv_img", 0); //HSV图
  30. cvShowImage( "hsv_img", hsv_img);
  31. cvNamedWindow( "h_img", 0); //H通道
  32. cvShowImage( "h_img", h_img);
  33. cvNamedWindow( "s_img", 0); //S通道
  34. cvShowImage( "s_img", s_img);
  35. cvNamedWindow( "v_img", 0); //V通道
  36. cvShowImage( "v_img", v_img);
  37. cvWaitKey( 0);
  38. cvReleaseImage(&hsv_img);
  39. cvReleaseImage(&h_img);
  40. cvReleaseImage(&s_img);
  41. cvReleaseImage(&v_img);
  42. cvDestroyWindow( "hsv_img");
  43. cvDestroyWindow( "h_img");
  44. cvDestroyWindow( "s_img");
  45. cvDestroyWindow( "v_img");
  46. return 0;
  47. }
测试样例2
    
   
   

    
   
   
  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include "cxcore.h"
  4. /*---------------copyright-hanshanbuleng-------------
  5. 问题描述:
  6. 用cvShowImage显示32bits float(IPL_DEPTH_32F)型单通道灰度图像时就出了问题,
  7. 图像只有黑白两种颜色,没有灰色的,出现了严重失真,这就是没有正确显示;
  8. 问题原因:
  9. 如果图像是32位float型,cvShowImage会把像素值乘以255然后再与[0,255]的colormap结合起来显示图像,
  10. 也就是说,原来32位folat型图像中值为0的像素被显示成黑色,值大于或等于1的像素被显示成白色。
  11. ---------------------------------------------------*/
  12. //此时H的范围只能在0~360之间
  13. int main()
  14. {
  15. float H,S,V,H1,S1,V1;
  16. IplImage *src = cvLoadImage( "F:\\vs2010program\\RGB_HSV\\study_test\\2.jpg", 1);
  17. IplImage *hsv_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F , 3);
  18. cvConvertScale(src, hsv_img, 1.0, 0.0);
  19. IplImage *hsv_img1 = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F , 3);
  20. IplImage *h_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
  21. IplImage *s_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
  22. IplImage *v_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
  23. IplImage *h_img1 = cvCreateImage(cvGetSize(src), 8, 1);
  24. IplImage *s_img1 = cvCreateImage(cvGetSize(src), 8, 1);
  25. IplImage *v_img1 = cvCreateImage(cvGetSize(src), 8, 1);
  26. cvCvtColor(hsv_img, hsv_img1, CV_BGR2HSV);
  27. cvSplit(hsv_img1, h_img, s_img, v_img, NULL);
  28. for( int y = 0; y < hsv_img->height; y++){
  29. for( int x = 0; x < hsv_img->width; x++)
  30. {
  31. H1 = cvGetReal2D(h_img, y, x); //0-360
  32. S1 = cvGetReal2D(s_img, y, x); //0-1
  33. V1 = cvGetReal2D(v_img, y, x); //0-255
  34. 地址法 还是有问题 待研究
  35. //H = (double)h_img->imageData[y*h_img->widthStep + x*h_img->nChannels];
  36. //S = s_img->imageData[y*s_img->widthStep + x*s_img->nChannels];
  37. //V = v_img->imageData[y*v_img->widthStep + x*v_img->nChannels];
  38. printf( "H:%f S:%f V:%f \n",H1,S1,V1);
  39. }
  40. }
  41. cvCvtScale(v_img,h_img1, 255.0/ 360.0);
  42. cvNamedWindow( "hsv_img"); //HSV图
  43. cvShowImage( "hsv_img", hsv_img);
  44. cvNamedWindow( "h_img"); //H通道 0-360 显示不正常
  45. cvShowImage( "h_img", h_img);
  46. cvNamedWindow( "s_img"); //S通道 0-1
  47. cvShowImage( "s_img", s_img);
  48. cvNamedWindow( "h_img1"); //V通道 0-255
  49. cvShowImage( "h_img1", h_img1);
  50. cvNamedWindow( "v_img");
  51. cvShowImage( "v_img", v_img);
  52. cvWaitKey( 0);
  53. cvReleaseImage(&hsv_img);
  54. cvReleaseImage(&h_img);
  55. cvReleaseImage(&s_img);
  56. cvReleaseImage(&v_img);
  57. cvDestroyWindow( "hsv_img");
  58. cvDestroyWindow( "h_img");
  59. cvDestroyWindow( "s_img");
  60. cvDestroyWindow( "v_img");
  61. return 0;
  62. }
测试样例3
    
   
   

    
   
   
  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include "cxcore.h"
  4. /*--------------copyright-hanshanbuleng--------------------*/
  5. //此时H,S,V的范围均在0~255之间
  6. int main()
  7. {
  8. float H,S,V,H1,S1,V1;
  9. IplImage *src = cvLoadImage( "F:\\vs2010program\\RGB_HSV\\study_test\\2.jpg", 1);
  10. IplImage *hsv_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F , 3);
  11. cvConvertScale(src, hsv_img, 1.0, 0.0);
  12. IplImage *hsv_img1 = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F , 3);
  13. IplImage *h_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
  14. IplImage *s_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
  15. IplImage *v_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
  16. IplImage *h = cvCreateImage(cvGetSize(src), 8, 1);
  17. IplImage *s = cvCreateImage(cvGetSize(src), 8, 1);
  18. IplImage *v = cvCreateImage(cvGetSize(src), 8, 1);
  19. cvCvtColor(hsv_img, hsv_img1, CV_BGR2HSV);
  20. cvSplit(hsv_img1, h_img, s_img, v_img, NULL);
  21. //转换表示范围
  22. cvConvertScale(h_img, h, ( 1.0/ 360)* 255, 0.0);
  23. cvConvertScale(s_img, s, 255.0, 0.0);
  24. cvConvertScale(v_img, v, 1.0, 0.0);
  25. for( int y = 0; y < hsv_img->height; y++){
  26. for( int x = 0; x < hsv_img->width; x++)
  27. {
  28. //转换后的h_img,s_img,v_img 取值查看
  29. /*----------------------------------*/
  30. //转换后的h,s,v 取值查看
  31. // H1 = cvGetReal2D(h_img, y, x);
  32. // S1 = cvGetReal2D(s_img, y, x);
  33. // V1 = cvGetReal2D(v_img, y, x);
  34. //
  35. // //地址法 对比
  36. // H = (double)h_img->imageData[y*h_img->widthStep + x*h_img->nChannels];
  37. // S = (double)s_img->imageData[y*s_img->widthStep + x*s_img->nChannels];
  38. // V = v_img->imageData[y*v_img->widthStep + x*v_img->nChannels];
  39. /*----------------------------------*/
  40. //转换后的h,s,v 取值查看
  41. /*----------------------------------*/
  42. H1 = cvGetReal2D(h, y, x);
  43. S1 = cvGetReal2D(s, y, x);
  44. V1 = cvGetReal2D(v, y, x);
  45. //地址法 对比
  46. H = (uchar)h->imageData[y*h->widthStep + x*h->nChannels];
  47. S = (uchar)s->imageData[y*s->widthStep + x*s->nChannels];
  48. V = (uchar)v->imageData[y*s->widthStep + x*s->nChannels];
  49. /*----------------------------------*/
  50. printf( "H:%f S:%f V:%f \n",H,S,V);
  51. }
  52. }
  53. cvNamedWindow( "hsv_img", 0); //HSV图
  54. cvShowImage( "hsv_img", hsv_img);
  55. cvNamedWindow( "h_img", 0); //H通道
  56. cvShowImage( "h_img", h_img);
  57. cvNamedWindow( "s_img", 0); //S通道
  58. cvShowImage( "s_img", s_img);
  59. cvNamedWindow( "v_img", 0); //V通道
  60. cvShowImage( "v_img", v_img);
  61. cvWaitKey( 0);
  62. cvReleaseImage(&hsv_img);
  63. cvReleaseImage(&h_img);
  64. cvReleaseImage(&s_img);
  65. cvReleaseImage(&v_img);
  66. cvDestroyWindow( "hsv_img");
  67. cvDestroyWindow( "h_img");
  68. cvDestroyWindow( "s_img");
  69. cvDestroyWindow( "v_img");
  70. return 0;
  71. }
 
    
   
   

4.引申—本实例使用opencv函数简介

函数介绍百度一下就可以,在此我只是简单说明一下

cvLoadImage() //加载图片

cvCreateImage()//创建图片大小

cvCvtColor()  //空间转换

cvSplit()     //分离不同通道

cvCvtScale()  //调整比例

cvNamedWindow()//创建图像显示窗口

cvReleaseImage()//释放创建的图片

cvWaitKey()    //等待

cvDestroyWindow()//销毁窗口


5.参考链接

https://blog.csdn.net/yangdashi888/article/details/53782481

https://blog.csdn.net/zhupananhui/article/details/21157541

https://baike.baidu.com/item/HSV/547122

 



猜你喜欢

转载自blog.csdn.net/s294878304/article/details/103542459