9

我是opencv的初学者。我正在使用 opencv v2.1。我已将 RGB 图像转换为 HSV 图像。现在我想分别获得单通道色相、值和饱和度。我应该怎么办?我在这里看到过类似的问题,但没有人回答。请帮忙。

4

3 回答 3

14

您可以访问与访问 RGB 图像相同的方式,其中第一个通道用于 H,第二个通道用于 S,第三个通道用于 V。

如果您使用的是 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 这样的结构,就像 2D 数组一样很容易处理。

编辑:如果您使用的是 Mat,那么您可以轻松地将通道分开。假设您的 hsv 垫是Mat img_hsv. 然后 :

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

看看你能不能解决这个问题。

于 2013-06-19T07:27:51.253 回答
8

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()
于 2018-01-16T20:00:31.150 回答
5

这是一个垫子:

    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];
于 2013-06-19T08:14:58.213 回答