how to obtain a single channel value image from HSV image in opencv 2.1?


I am a beginner in opencv. I am using opencv v2.1. I have converted an RGB image to HSV image. Now I want to obtain single channels Hue, Value and Saturation separately. What should I do? I have seen similar questions here but No-one answered that. Kindly help.


You can access the same way you were accessing for RGB image where 1st channel will be for H, 2nd channel for S and 3rd channel for V.

If you are using OpenCV 2.1, you must be using IplImage then, right? like if your HSV image is IplImage *src.

IplImage* h = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 ); IplImage* s = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 ); IplImage* v = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 ); // Split image onto the color planes cvSplit( src, h, s, v, NULL );

<strong>cvSplit</strong> function splits a multichannel array into several single channels. Correct me if I am wrong. I would recommend using OpenCV 2.4. It has structs like cvMat which are very easy to handle just like 2D arrays.

<strong>EDIT</strong>: If you are using Mat then you can separate the channels out easily. Let's say your hsv mat is Mat img_hsv. Then :

vector<Mat> hsv_planes; split( img_hsv, hsv_planes ); hsv_planes[0] // H channel hsv_planes[1] // S channel hsv_planes[2] // V channel

See if you can work out with this.


Here it is for a Mat:

cv::Mat hsv_image = ...; std::vector<cv::Mat> hsv_channels; cv::split(hsv_image, hsv_channels); cv::Mat h_image = hsv_channels[0]; cv::Mat s_image = hsv_channels[1]; cv::Mat v_image = hsv_channels[2];


<strong>Solution for Python:</strong>

import cv2 from matplotlib import pyplot as plt # Read image in BGR img_path = "test.jpg" img = cv2.imread(img_path) # Convert BGR to HSV and parse HSV hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) h, s, v = hsv_img[:, :, 0], hsv_img[:, :, 1], hsv_img[:, :, 2] # Plot result images plt.imshow("Original", cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.imshow("HSV", hsv_img) plt.imshow("H", h) plt.imshow("S", s) plt.imshow("V", v) plt.show()