【问题标题】:how to obtain a single channel value image from HSV image in opencv 2.1?如何从opencv 2.1中的HSV图像中获取单通道值图像?
【发布时间】:2013-06-19 07:20:45
【问题描述】:

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

【问题讨论】:

    标签: opencv image-processing computer-vision computer-science hsv


    【解决方案1】:

    您可以访问与访问 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
    

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

    【讨论】:

    • 那么在你完成你必须做的事情之后,你如何将 H,S,V Mats 重新组合成一个合成图像?
    • 您好,对于第二种方法,每个通道的数据类型为Mat。它打印类似Mat [ 8*8*CV_8UC3, isCont=true, isSubmat=false, nativeObj=0x514dee50 ] 的内容。如何以简单值的形式找到它,以便将其打印在屏幕上,以及使用这些值以某种方式预览颜色以进行验证?
    【解决方案2】:

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

    【讨论】:

      【解决方案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];
      

      【讨论】:

      • 您好,每个通道的数据类型都是 Mat。它打印类似 Mat [ 8*8*CV_8UC3, isCont=true, isSubmat=false, nativeObj=0x514dee50 ] 的东西。如何以简单值的形式找到它,以便我可以在屏幕上打印它,以及使用这些值以某种方式预览颜色,以进行验证?感谢您的帮助。
      • @Solace,请将您的评论作为新问题提交,并详细说明您正在尝试实现的目标。您还应该包含您的(Java?)代码。
      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多