【问题标题】:Noisy hue in OpenCVOpenCV中的嘈杂色调
【发布时间】:2017-08-01 00:40:12
【问题描述】:

这个问题是关于在 VS2008 express 中使用 c++ 的 opencv。

我正在做非常简单的事情。尝试从相机图像中获取皮肤值。

正如您在屏幕截图中看到的,相机图像看起来相当不错。我将其转换为 HSV 并将 Hue 通道从中分离出来,以便稍后阈值皮肤值。但是 Hue 通道似乎过于嘈杂和颗粒感。 HSV 图像窗口也显示信息的退化。为什么会这样?以及如何解决。如果我们不能通过某种平滑来消除噪音?代码如下:

#include <opencv2/opencv.hpp>
int main(){
    cv::VideoCapture cap(0); // open the default camera   
    cv::Mat hsv, bgr, skin;//make image & skin container
    cap >> bgr; 
    //cvNamedWindow("Image");
    //cvNamedWindow("Skin");    
    //cvNamedWindow("Hue");
    cv::cvtColor(bgr, hsv, CV_BGR2HSV);
    std::vector<cv::Mat> channels;
    cv::split(hsv, channels);
    cv::Mat hue;
    hue = channels[0];  
    cv::imshow("Image", bgr);cvMoveWindow("Image",0,0);
    cv::imshow("HSV", hsv);cvMoveWindow("HSV",660,0);
    cv::imshow("Hue", hue);cvMoveWindow("Hue",0,460);   

    cvWaitKey(0);//wait for key press   
    return 0;   
}

【问题讨论】:

  • 嗯,原图也很吵。我对色调嘈杂并不感到惊讶。看看这堵墙——随机的一堆 r g b salt-pepper 像素,它们创建了一个灰色的墙。

标签: c++ visual-studio-2008 opencv


【解决方案1】:

Hue 通道似乎过于嘈杂和颗粒感。为什么会这样?

在我们看到的真实颜色中,“hue” 所代表的部分信息会有所不同。红色完全由色调来描述。黑色完全没有色调信息。

但是,当您在 HSV 中表示颜色时,色调始终是颜色信息的三分之一

因此,当颜色接近任何灰色阴影时,色调分量将被人为夸大。这就是你看到的颗粒感。越接近灰色,必须放大的色调就越多,包括捕获的色调误差。

HSV 图像窗口也显示信息退化。为什么会这样?

转换中会有舍入误差,但可能没有您想象的那么多。尝试将您的 HSV 图像转换回 BGR,看看实际发生了多少退化。

& 如何解决。

实际上,您有两种选择。

使用质量更高的相机,或者不要使用 HSV 格式。

【讨论】:

  • @Rajdeep 这是一个新问题,对此评论部分将涉及太多讨论。我建议发布一个新问题。
【解决方案2】:

如果您查看 OpenCV 文档中带有参数 cvtColor 的函数 CV_BGR2HSV 的公式,您将拥有

现在,当您有灰色阴影时,即当 R 等于 B 并且 R 等于 G 时,H 公式中的分数始终是未定义的,因为它是零除以零。在我看来,文档没有描述在这种情况下会发生什么。

【讨论】:

  • V = 0 时如何计算Hue 或单个恒定彩色图像?当V0 时,min(R, G, B) 必须为0(如V = max(R, G, B) 本身就是0)。所以分母在Hue 的方程中变为0。同样的情况出现在单个常量彩色图像中,因为Vmin(R, G, B) 相同并相互抵消并变为0
猜你喜欢
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2013-04-19
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多