[英]Error when converting from HSV to BGR, or HSV to JPEG in openCV after using inRange
[英]Blocky behavior when converting bgr to hsv in opencv
我正在尝试将 bgr mat 转换为 hsv mat 以进行某些检测,但是 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
通道(值/亮度)非常低的地方, H
& S
通道非常不稳定并且毫无意义。 在极端情况下: [128,255,0] == [0,0,0]
。
因此,图像暗区中非常小的且不明显的压缩伪像会随着HSV
颜色空间的假色变得非常突出。
如果您想使用HSV
颜色空间作为颜色比较的特征空间,请记住,如果V
非常低,那么H & S
就毫无意义。 对于使H
值毫无意义的非常低的S
值也是如此( [0,0,100] == [128,0,100]
)。
顺便提一句。 还要记住, H
通道是循环的, H == 0
和H == 255
之间的差异只是一个灰度级。
HSV
图像cvtColor
图像转换回RGB
我认为这是因为imshow
函数总是将图像解释为简单的 RGB 或 BGR 图像。 因此,您需要在显示图像之前使用cvtColor(input,input,CV_HSV2BGR)
将 HSV 改回 BGR。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.