此图像只是一个例子。右上角是原始图像,左上角是色相,左下角是饱和度,右下角是值。可以很容易地看出,H和S都充满了伪影。我想降低亮度,因此结果会选择很多这种伪像。

我做错了什么?

我的代码很简单:

vc = cv2.VideoCapture( 0 )
# while true and checking ret
ret, frame = vc.read()
frame_hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
cv2.imshow("h", frame_hsv[:,:,0])
cv2.imshow("s", frame_hsv[:,:,1])
cv2.imshow("v", frame_hsv[:,:,2])

最佳答案

我觉得您的问题有误会。虽然博伊科·佩拉诺夫(Boyko Peranov)的回答确实是正确的,但您提供的图像没有问题。其背后的逻辑如下:您的相机在RGB颜色空间中拍照,根据定义,该空间是一个立方体。将其转换为HSV颜色空间时,所有像素都映射到以下圆锥体:

色相(HSV的第一通道)是圆锥上的 Angular ,饱和度(HSV的第二通道,在图像中称为色度)是到圆锥中心的距离,而值(HSV的第三通道)是高度在锥上。

色相通道通常在0-360之间定义,并从0处的红色开始(对于8位图像,OpenCV使用0-180范围来适应the documentation中所述的无符号字符)。但事实是,值0和359的两个像素实际上在颜色上非常接近。通过仅取外表面来展平HSV圆锥体时(在最大饱和度时),可以更容易地看到它:

即使这些值在感觉上很接近(0时为红色,359时为红色,紫色略微一点),但这两个值相距甚远。这是您在Hue channel 中描述的“ Artifact ”的原因。当OpenCV以灰度显示给您时,它将黑色映射为0,将白色映射为359。实际上,它们实际上是相似的颜色,但是以灰度映射时,显示的距离太远。有两种方法可以避免这种违反直觉的事实:您可以将H通道重新投射到具有固定饱和度和值的RGB空间中,这将更接近于我们的感知。您还可以根据感知使用其他颜色空间(例如Lab color space),而不会给您这些数学上的副作用。

这些伪影块为方形的原因由Boyko Peranov解释。 JPEG压缩通过将像素替换为更大的正方形来工作,该正方形近似于它所替换的补丁。如果在创建jpg时确实降低了压缩质量,那么即使在RGB图像中,您也会看到这些正方形出现。质量越低,正方形越大,可见度越高。这些正方形的平均值是一个单一值,对于红色,可能最终介于0到5(显示为黑色)或355和359(显示为白色)之间。这就解释了为什么“伪像”是正方形的。

我们也可能会问自己,为什么在色调通道中可见更多的JPEG压缩伪像。这是由于chroma subsampling所致,在该研究中,基于感知的研究表明,与强度的快速变化相比,我们的眼睛更不容易看到颜色的快速变化。因此,在压缩时,JPEG会故意丢失色度信息,因为我们还是不会注意到它。

饱和度(您的左下图)白色变化点的情况与此类似。您正在描述接近黑色的像素(在圆锥体的顶端)。因此,“饱和度”值可能会有很大变化,但不会对像素的颜色产生太大影响:它始终接近黑色。这也是HSV颜色空间不完全基于感知的副作用。

RGB(或OpenCV的BGR)和HSV之间的转换(理论上)是无损的。您可以说服自己:将HSV图像重新转换为RGB图像,即可获得与开始时完全相同的图像,而没有添加任何伪像。

07-28 02:55
查看更多