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.Answer1:
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* 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.
If you are using Mat then you can separate the channels out easily.
Let's say your hsv mat is
vector<Mat> hsv_planes; split( img_hsv, hsv_planes ); hsv_planes // H channel hsv_planes // S channel hsv_planes // V channel
See if you can work out with this.Answer2:
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; cv::Mat s_image = hsv_channels; cv::Mat v_image = hsv_channels;Answer3:
<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()