繁体   English   中英

在 opencv 中将 bgr 转换为 hsv 时出现块状行为

[英]Blocky behavior when converting bgr to hsv in opencv

我正在尝试将 bgr mat 转换为 hsv ma​​t 以进行某些检测,但是 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;
}

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

我在评论部分提出了一个解释,但决定实际验证我的假设并解释一点关于HSV颜色空间。

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

我使用 OpenCV s cvtColor` 将图像转换回RGB ,并且工件神奇地消失了(图像如下)。

特别是HSV色彩空间有几个特征会夸大这些伪像。 其中重要的可能是V通道(值/亮度)非常低的地方, HS通道非常不稳定并且毫无意义。 在极端情况下: [128,255,0] == [0,0,0]

因此,图像暗区中非常小的且不明显的压缩伪像会随着HSV颜色空间的假色变得非常突出。

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

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

  • 问题中发布的假色“块状” HSV图像@scribblemaniac 发布的 HSV 图片
  • 使用cvtColor图像转换回RGB转换回 RGB 后的相同图像

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM