当前位置:   article > 正文

opencv学习4——HSV与RGB的转换_opencv hsv转rgb

opencv hsv转rgb

在进行HSV和RGB转换之前大致了解一下两者的区别。

HSV颜色模型是根据颜色的直观特征所创立的一种颜色模型,它的名字就代表了这个模型的三个参数H,S,V。模型为六棱锥,三个参数就在上面不同维度进行表示。模型如下。原图来源百度百科。前者是空间模型,后者是模型概念图

H(Hue):色调。采用角度表示,在模型中为棱锥的底面,因此范围就是0~360度,如图所示,不同的角度规定了不同的颜色。0度表示红色,每隔120度分别为绿色和蓝色,对应三基色RGB,他们两两之间又以60度为间隔加入互补色,由0度逆时针开始分别为黄色,青色和品红色(紫色)。

S(Saturation):饱和度。定义为接近光谱色的程度。取值范围是0~1(图片为IPL_DEPTH_32F类型)或0~255(图片为IPL_DEPTH_8UC类型),饱和度越高颜色越深,白色的饱和度为0,。

V(Value):明度。颜色的明暗程度,范围0~1,0为黑色,1为白色。图片类型不同的情况同S。

RGB模型为三维立体图,模型如下所示。每隔维度的取值范围是0~255,0为黑色,255为白色。

两者之间具有密切的关联,当RGB的模型沿着原点的对角线,即黑色点与白色点的连线为垂直轴观察就会转换至HSV的模型。

RGB->HSV的转换关系如下。

  1. max=max(R,G,B)
  2. min=min(R,G,B)
  3. H= 0 (max=min)
  4. 60 x (G-R) / (max-min) + 60 (min=B)
  5. 60 x (B-G) / (max-min) + 180 (min=R)
  6. 60 x (R-B) / (max-min) + 300 (min=G)
  7. S = Max - Min
  8. V = Max

或者是

  1. max=max(R,G,B)
  2. min=min(R,G,B)
  3. H = (G-B)/(max-min)* 60 (R = max)
  4. 120+(B-R)/(max-min)* 60 (G = max)
  5. 240 +(R-G)/(max-min)* 60 (B = max)
  6. H+ 360 (H < 0)
  7. S=(max-min)/max
  8. V=max(R,G,B)

HSV->RGB的转换关系如下。https://blog.csdn.net/qq_45391763/article/details/103450672

代码如下。

  1. #include"iostream"
  2. #include"opencv2/core/core.hpp"
  3. #include"opencv2/highgui/highgui.hpp"
  4. #include<opencv2/opencv.hpp>
  5. #include<math.h>
  6. using namespace cv;
  7. using namespace std;
  8. Mat BGR2HSV(Mat bgrimg){
  9. int bgrimgcol = bgrimg.cols;
  10. int bgrimgrow = bgrimg.rows;
  11. float r, g, b;
  12. float h, s, v;
  13. float Max, Min;
  14. Mat hsvimg = Mat::zeros(bgrimgrow, bgrimgcol, CV_32FC3);
  15. for (int j = 0; j < bgrimgrow; j++) {
  16. for (int i = 0; i < bgrimgcol; i++) {
  17. r = (float)bgrimg.at<Vec3b>(j, i)[2]/255;
  18. g = (float)bgrimg.at<Vec3b>(j, i)[1]/255;
  19. b = (float)bgrimg.at<Vec3b>(j, i)[0]/255;
  20. Max = max(r, max(g, b));
  21. Min = min(r, min(g, b));
  22. if (Max == Min) {
  23. h = 0;
  24. }
  25. else if (Min == b) {
  26. h = 60 * (g - r) / (Max - Min) + 60;
  27. }
  28. else if (Min == r) {
  29. h = 60 * (b - g) / (Max - Min) + 180;
  30. }
  31. else if (Min == g) {
  32. h = 60 * (r - b) / (Max - Min) + 300;
  33. }
  34. s = Max - Min;
  35. v = Max;
  36. hsvimg.at<Vec3f>(j, i)[0] = h;
  37. hsvimg.at<Vec3f>(j, i)[1] = s;
  38. hsvimg.at<Vec3f>(j, i)[2] = v;
  39. }
  40. }
  41. return hsvimg;
  42. }
  43. void main(){
  44. Mat img = imread("ck567.jpg", IMREAD_COLOR);
  45. Mat out = BGR2HSV(img);
  46. imshow("sample",out);
  47. waitKey(0);
  48. destroyAllWindows();
  49. }

HSV转换BGR的函数如下

  1. Mat HSV2BGR(Mat hsvimg){
  2. int hsvimgcol = hsvimg.cols;
  3. int hsvimgrow = hsvimg.rows;
  4. Mat hsv = Mat::zeros(hsvimgrow, hsvimgcol, CV_8UC3);
  5. float h, s, v;
  6. double c, h_, x;
  7. double r, g, b;
  8. for (int y = 0; y < hsvimgrow; y++) {
  9. for (int x = 0; x < hsvimgcol; x++) {
  10. h = hsvimg.at<Vec3f>(y, x)[0];
  11. s = hsvimg.at<Vec3f>(y, x)[1];
  12. v = hsvimg.at<Vec3f>(y, x)[2];
  13. c = s;
  14. h_ = h / 60;
  15. x = c * (1 - abs(fmod(h_, 2) - 1));
  16. r = g = b = v - c;
  17. if (h_ < 1) {
  18. r += c;
  19. g += x;
  20. }
  21. else if (h_ < 2) {
  22. r += x;
  23. g += c;
  24. }
  25. else if (h_ < 3) {
  26. g += c;
  27. b += x;
  28. }
  29. else if (h_ < 4) {
  30. g += x;
  31. b += c;
  32. }
  33. else if (h_ < 5) {
  34. r += x;
  35. b += c;
  36. }
  37. else if (h_ < 6) {
  38. r += c;
  39. b += x;
  40. }
  41. //以上代码可用switch结构代替
  42. hsv.at<Vec3b>(y, x)[0] = (uchar)(b * 255);
  43. hsv.at<Vec3b>(y, x)[1] = (uchar)(g * 255);
  44. hsv.at<Vec3b>(y, x)[2] = (uchar)(r * 255);
  45. }
  46. }
  47. return hsv;
  48. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/593793
推荐阅读
相关标签
  

闽ICP备14008679号