回答

11

您可以訪問您在訪問RGB圖像以相同的方式,其中第一通道將成爲H,爲V.對於s第二通道和第三通道

如果您正在使用的OpenCV 2.1,您必須使用的IplImage那麼,對吧? 如果您的HSV圖像是 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); 

cvSplit功能分割的多通道陣列分成多個單信道。糾正我,如果我錯了。 我會推薦使用OpenCV 2.4。它有像cvMat這樣的結構,非常容易處理,就像二維數組一樣。

編輯: 如果您使用的是Mat,那麼您可以輕鬆分離出渠道。 假設您的hsv墊子是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 

看看你是否可以解決這個問題。

+0

你這樣做後,你的寶貝做,怎麼給你重組的H,S, V再次揉成複合圖像? –

+1

嗨,對於第二種方法,每個通道的數據類型是「Mat」。它打印出類似'Mat [8 * 8 * CV_8UC3,isCont = true,isSubmat = false,nativeObj = 0x514dee50]'。如何以簡單值的形式找到它,以便我可以將其打印在屏幕上,並使用這些值以某種方式預覽顏色,以進行驗證? – Solace

3

這是一個太:

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]; 
+0

感謝您的幫助。 – userXktape

+0

嗨,每個通道的數據類型是墊子。它打印一些像Mat [8 * 8 * CV_8UC3,isCont = true,isSubmat = false,nativeObj = 0x514dee50]。如何以簡單值的形式找到它,以便我可以將其打印在屏幕上,並使用這些值以某種方式預覽顏色,以進行驗證?我會感謝你的幫助。 – Solace

+1

@Solace,請將您的評論作爲一個新問題提交,並提供更多關於您嘗試實現的細節。你還應該包含你的(Java?)代碼。 – Bull

0

解決方案的Python:

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()