OpenCV HSVtoRGB - eiichiromomma/CVMLAB GitHub Wiki
(OpenCV) HSV to RGB
HSV表色系の値をRGBへ変換
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;
}
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;
}
途中で循環してしまっている
左右の端で同色になっている
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()