【问题标题】:Blocky behavior when converting bgr to hsv in opencv在opencv中将bgr转换为hsv时出现块状行为
【发布时间】:2014-01-28 13:10:08
【问题描述】:

我正在尝试将 bgr 垫转换为 hsv 垫以进行某些检测,但 hsv 图像不断出现块状。这是我在 C++ 中的代码:

int main() {
    const int device = 1;
    VideoCapture capture(device);
    Mat input;
    int key;
    if(!capture.isOpened()) {
        printf("No video recording device under device number %i found. Aborting program...\n", device);
        return -1;
    }
    namedWindow("Isolation Test", CV_WINDOW_AUTOSIZE);
    while(1) {
        capture >> input;
        cvtColor(input, input, CV_BGR2HSV);
        imshow("Isolation Test", input);
        key = static_cast<int>(waitKey(10));
        if(key == 27)
            break;
    }
    destroyWindow("Isolation Test");
    return 0;
}

Here 是输出的快照。当我注释掉 cvtColor 时,输入看起来并不块状。有什么问题,我应该怎么做才能解决它?

【问题讨论】:

  • 在转换之前图像可能是块状的,但很难检测到。 JPEG/MPEG 压缩利用了我们的“视觉管道”的缺陷,并由此产生了许多难以检测的伪影,当您使用假色(例如 HSV 通道)显示图像时,它们有时会变得非常明显。您可以将图像保存为无损格式 (png/tiff),并使用颜色检查器检查实际值。
  • 我什至可以在 3.0 (master) 中重现它。还具有不同的网络摄像头型号/驱动程序。它只发生在网络摄像头捕获中,而不是 imread()。不错的谜题;)
  • @scribblemaniac,你可能想make an issue here

标签: c++ opencv hsv


【解决方案1】:

我认为这是因为imshow 函数将始终将图像解释为简单的 RGB 或 BGR 图像。因此,您需要在显示图像之前使用cvtColor(input,input,CV_HSV2BGR) 将 HSV 更改回 BG​​R。

【讨论】:

    【解决方案2】:

    我在 cmets 部分提出了解释,但决定实际验证我的假设并稍微解释一下HSV 色彩空间。

    代码和OpenCV的cvtColor都没有问题。 RGB 图像中存在“块状”伪影,但并不明显。所有 JPEG 系列压缩算法都会产生这些伪影。我们通常看不到它们的原因是算法“利用”了我们视觉系统中的弱点并压缩了更多我们不太敏感的东西。

    我使用 OpenCVscvtColor` 将图像转换回 RGB,然后伪影神奇地消失了(图片如下)。

    HSV 色彩空间尤其具有夸大这些伪影的几个特征。其中重要的一点可能是,无论V 通道(值/亮度)非常低,HS 通道都非常不稳定并且毫无意义。极端:[128,255,0] == [0,0,0]

    因此,图像暗区中非常微小且不易察觉的压缩伪影在 HSV 色彩空间的假色中变得非常突出。

    如果您想使用HSV 颜色空间作为颜色比较的特征空间,请记住,如果V 非常低,H &amp; S 就毫无意义。对于使H 值变得毫无意义的非常低的S 值也是如此([0,0,100] == [128,0,100])。

    顺便说一句。还要记住H 通道是循环的,H == 0H == 255 之间只有一个灰度级。

    • 错误颜色“块状”HSV 问题中发布的图像
    • 使用cvtColor 转换回RGB 的图像

    【讨论】:

    • 感谢您的跟进,这对我有很大帮助。我明白你在说什么,我想我只需要相应地调整我的范围来弥补这一点。
    • 没问题,我可以简单地使用 RGB 颜色空间(虽然它不是很流行),或者在 HSV 中定义一个对低 V 或 S 值具有鲁棒性的距离函数。
    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2022-12-20
    相关资源
    最近更新 更多