Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python opencv、BGR2HSV创建了大量工件_Python_Opencv_Image Processing_Hsv - Fatal编程技术网

Python opencv、BGR2HSV创建了大量工件

Python opencv、BGR2HSV创建了大量工件,python,opencv,image-processing,hsv,Python,Opencv,Image Processing,Hsv,这张图片只是一个例子。右上角是原始图像,左上角是色调,左下角是饱和度,右下角是值。可以很容易地看到,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_

这张图片只是一个例子。右上角是原始图像,左上角是色调,左下角是饱和度,右下角是值。可以很容易地看到,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])

您使用的是有损压缩图像,因此是矩形瑕疵。对于视频,您的曝光时间较短,可能存在带宽限制等,因此整体图像质量会下降。你可以:

  • 通过使用
    Capture
    而不是
    VideoCapture
    来使用一系列静态快照,或者
  • 提取5-10个视频帧,并对其进行平均

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

      色调(HSV的第一个通道)是圆锥体上的角度,饱和度(HSV的第二个通道,在图像中称为色度)是到圆锥体中心的距离,值(HSV的第三个通道)是圆锥体上的高度

      色调通道通常定义在0-360之间,从0处的红色开始(对于8位图像,OpenCV使用0-180范围来拟合中所述的无符号字符)。但问题是,值为0和359的两个像素在颜色上非常接近。仅取外表面(饱和度最大时)展平HSV锥体时,更容易看到:

      即使这些值在感知上很接近(0处为完全红色,359处为红色,略带紫色),这两个值也相差很远。这就是您在色调通道中描述的“瑕疵”的原因。当OpenCV以灰度显示给您时,它将黑色映射为0,白色映射为359。事实上,它们的颜色非常相似,但当以灰度贴图时,它们显示的距离太远。有两种方法可以绕过这一反直觉的事实:您可以使用固定的饱和度和值将H通道重新投射到RGB空间,这将更接近我们的感知。你也可以使用另一个基于感知的颜色空间(比如颜色空间),它不会给你带来这些数学上的副作用

      博伊科·佩拉诺夫(Boyko Peranov)解释了这些人工制品斑块呈方形的原因。JPEG压缩的工作原理是将像素替换为更大的正方形,该正方形近似于它所替换的面片。如果在创建jpg时将压缩质量降低,则可以看到这些方块甚至出现在RGB图像中。质量越低,正方形越大,越明显。这些方块的平均值是一个单一值,对于红色色调,该值可能最终介于0和5(显示为黑色)或355和359(显示为白色)之间。这就解释了为什么“人工制品”是方形的

      我们可能还会问自己,为什么在色调通道中会出现更多的JPEG压缩伪影。这是因为,基于感知的研究表明,与强度的快速变化相比,我们的眼睛更不容易看到颜色的快速变化。所以,当压缩时,JPEG故意丢失色度信息,因为我们无论如何都不会注意到它

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


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

      您能否包含完整的可复制示例,包括您在图像中读取并写出新图像的代码?(包括原始图像也会有帮助)我用代码修改了它。我是从网络摄像机上读的,如果能从图像上读出来,那会很有帮助,这样其他人就可以重现这个问题。但更重要的是,我们真的不清楚人工制品是什么意思,特别是在s图像中。你是说原始图像中的白色阴影区域吗?你是什么意思?
      result挑选了很多这样的工件
      :你是想保留工件还是去除它们?我在OpenCV中找不到Capture类。是从另一个图书馆来的吗?hai Boyko Perfanov,我在另一个场景中遇到了同样的问题。有没有什么方法可以去除有损压缩产生的这些矩形伪影。