OpenCV HSVtoRGB - eiichiromomma/CVMLAB GitHub Wiki

(OpenCV) HSV to RGB

HSV表色系の値をRGBへ変換

やり方 (C++)

cv::COLOR_HSV2BGR_FULLだと色相Hの0-360を第1チャネル0-255に割当てる。(COLOR_HSV2BGRだと0-180)

#include <stdio.h>
#include <opencv2/opencv.hpp>

int main(int argc, const char * argv[])
{
    cv::Mat img1(256,256,CV_8UC3);
    cv::Mat img2(256,256,CV_8UC3);
    for (int y=0; y<img1.rows; y++) {
        for (int x=0; x<img1.cols; x++) {
            //結果は同じ
            img1.at<cv::Vec3b>(y,x)[0] = x; // cv::COLOR_HSV2BGR_FULLの場合
//            img1.at<cv::Vec3b>(y,x)[0] = x*(180./255.); //cv::COLOR_HSV2BGRの場合
            img1.at<cv::Vec3b>(y,x)[1] = y;
            img1.at<cv::Vec3b>(y,x)[2] = 255;
        }
    }
    cv::cvtColor(img1, img2, cv::COLOR_HSV2BGR_FULL);
    cv::imshow("test", img2);
    cv::waitKey(0);
    cv::destroyAllWindows();
    return 0;
}

やり方 (Python, cv2)

import numpy as np
import cv2

if __name__=='__main__':
    img1 = np.zeros((256,256,3),np.uint8)
    y,x = np.indices(img1.shape[:2])
    # x = x*(180./255.) #COLOR_HSV2BGRの場合
    img1[:,:,0] = x
    img1[:,:,1] = y
    img1[:,:,2] = 255
    img2 = cv2.cvtColor(img1,cv2.COLOR_HSV2BGR_FULL)
    cv2.imshow('HSV2BGR',img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

やり方 (旧)

cvCvtColorを使う。

値の範囲

  • H (Channel1)
  • -0~180の範囲。H/2の値を示す。181~255の範囲は0からの循環に回される
  • S (Channel2)
  • -0~255の範囲。255がS=1.0に相当。
  • V (Channel3)
  • -0~255の範囲。255がV=1.0に相当。

サンプル

x方向にHueを回していく。

    #include <cv.h>
    #include <highgui.h>

    int main(void)
    {
      int x,y;
      IplImage *image1,*image2;
      image1=cvCreateImage(cvSize(256,256),IPL_DEPTH_8U,3);
      image2=cvCreateImage(cvSize(256,256),IPL_DEPTH_8U,3);
      for(y=0; y<256; y++){
        for(x=0; x<256;x++){
          (image1->imageData+y*image1->widthStep)[x*3]=(unsigned char)(180.0*x/255.0);//H
          //失敗例
          //(image1->imageData+y*image1->widthStep)[x*3]=(unsigned char)x;//H
          
          (image1->imageData+y*image1->widthStep)[x*3+1]=(unsigned char)y;//S
          (image1->imageData+y*image1->widthStep)[x*3+2]=(unsigned char)255;//V
        }
      }
      cvCvtColor(image1,image2,CV_HSV2RGB);
      cvNamedWindow("RGB",CV_WINDOW_AUTOSIZE);
      cvShowImage("RGB",image2);
      cvWaitKey(0);
      cvSaveImage("HSV.jpg)",image2);
      cvReleaseImage(&image1);
      cvReleaseImage(&image2);
      return 0;
    }

サンプル実行結果

0~255を割当てた失敗例

途中で循環してしまっている

成功例

左右の端で同色になっている

Pythonの場合

      from opencv.cv import *
      from opencv.highgui import *
      import sys
      def main():
          image1=cvCreateImage(cvSize(256,256),IPL_DEPTH_8U,3)
          image2=cvCreateImage(cvSize(256,256),IPL_DEPTH_8U,3)
          for y in range(image1.height):
              for x in range(image1.width):
                  cvSet2D(image1,y,x,cvScalar(180.0*x/255.0,y,255))
          cvCvtColor(image1,image2,CV_HSV2RGB)
          cvNamedWindow("RGB",1)
          cvShowImage("RGB",image2)
          cvWaitKey(0)
          cvDestroyWindow("RGB")
          cvSaveImage("HSV.jpg)",image2)
          cvReleaseImage(image1)
          cvReleaseImage(image2)

      if __name__ == '__main__':
          main()
⚠️ **GitHub.com Fallback** ⚠️