【问题标题】:How to turn grayscale image into RGB?如何将灰度图像变成RGB?
【发布时间】:2021-11-03 03:07:57
【问题描述】:

我正在用 python 制作一个应用程序,允许人们共享他们的屏幕,但为了获得不错的帧速率,我想将图像压缩为灰度格式,然后在客户端将其转换回 RGB 图像.但是当我尝试这样做时,它仍然显示灰度图像。

然后我尝试使用 HSV 颜色转换,它确实显示了颜色,但由于某种原因使用了红色滤镜。

我不会显示所有代码,因为它至少有 2000 行,但我会显示我遇到问题的代码部分。

服务器端:

sct_img = sct.grab(bounding_box)
img_np = np.array(sct_img)
frame = img_np
frame = cv2.cvtColor(img_np, cv2.COLOR_BGR2GRAY)
frame = cv2.resize(frame, (0,0), fx = 0.70, fy = 0.70)
data = pickle.dumps(frame)
message_size = struct.pack("L", len(data))
clientsocket.sendall(message_size + data)

客户端:

 frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR)
 frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
 frame = cv2.resize(frame, (x, y))
 cv2.imshow('frame', frame)

【问题讨论】:

  • 查看如何创建minimal reproducible example
  • 你怎么知道是灰度的?
  • 转灰度不丢弃颜色信息吗?
  • 所以我知道它不是灰度,因为使用 cv2.COLOR_BRG2HSV 时显示颜色但带有红色滤镜,但是当我尝试显示没有 HSV 的图像时,它仍然是灰度

标签: python sockets networking pickle cv2


【解决方案1】:

当您将彩色图像还原为灰度时,您就是在丢弃信息。没有办法恢复颜色。如果您想获得可接受的帧速率,您将不得不选择其他方法。

【讨论】:

    【解决方案2】:

    当您将 RGB 图像转换为灰度图像时,颜色数据会被丢弃,因此您将无法恢复原始图像。观察下面代码的输出:

    import cv2
    import numpy as np
    
    # Create image
    img = np.full((500, 500, 3), 255, 'uint8')
    cv2.rectangle(img, (50, 100), (250, 300), (0, 0, 96), -1)
    cv2.circle(img, (300, 350), 100, (0, 50, 0), -1)
    cv2.drawContours(img, [np.array([(300, 50), (200, 250), (400, 250)])], 0, (255, 0, 0), -1)
    
    # Convert to grayscale
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    print(np.unique(img_gray))
    
    # Show images
    cv2.imshow("BGR", img)
    cv2.imshow("Gray", img_gray)
    cv2.waitKey(0)
    

    输出:

    如您所见,对于红色、绿色和蓝色形状的图像(每个颜色的特定阴影),将其转换为灰度会导致三种颜色变成一种颜色; (29, 29, 29)。计算机无法分辨出这三种形状曾经是不同的颜色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      相关资源
      最近更新 更多