【问题标题】:Can't convert image to grayscale when using OpenCV使用 OpenCV 时无法将图像转换为灰度
【发布时间】:2020-12-25 03:28:01
【问题描述】:

我有一个透明徽标,我想使用 OpenCV 将其转换为灰度。我正在使用以下代码

def to_grayscale(logo):
    gray = cv2.cvtColor(logo, cv2.COLOR_RGB2GRAY)
    blur = cv2.GaussianBlur(gray, (5, 5), 0)
    canny = cv2.Canny(blur, 50, 150)  # sick
    return canny

这是图像变量:

brand_logo = Image.open(current_dir + '/logos/' + logo_image, 'r').convert('RGBA')
brand_logo = to_grayscale(brand_logo)

这是错误:

TypeError: Expected Ptr<cv::UMat> for argument 'src'

我尝试使用 PIL 的.convert('L'),但它使它变成了 90% 的透明灰色。无论如何我可以解决这个问题吗?

更新

def to_grayscale(logo):
    OCVim = np.array(logo)
    BGRim = cv2.cvtColor(OCVim, cv2.COLOR_RGB2BGR)
    blurry = cv2.GaussianBlur(BGRim, (5, 5), 0)
    canny = cv2.Canny(blurry, 50, 150)
    PILim = Image.fromarray(canny)
    return PILim

【问题讨论】:

标签: python opencv python-imaging-library


【解决方案1】:

您将 OpenCVPIL/Pillow 不必要地混合在一起,会让自己感到困惑。如果你用 PIL 打开一个图像,你会得到一个 PIL Image,这对于 OpenCV 是完全没有用的,因为:

  • OpenCV 需要 Numpy arrays,而不是 PIL Images,并且
  • OpenCV 使用 BGR 排序,而不是像 PIL 使用的 RGB 排序。

保存图片时也是如此。

有三种可能的解决方案:

  • 坚持PIL
  • 坚持OpenCV
  • 每次在两个包之间移动时都会进行转换。

要从PIL Image 转换为OpenCVNumpy array

OCVim = np.array(PILim)

要从 OpenCVNumpy array 转换为 PIL Image

PILim = Image.fromarray(OCVim)

要反转颜色顺序,显然不需要灰度,请使用:

BGRim = cv2.cvtColor(RGBim, cv2.COLOR_RGB2BGR)

或使用负的 Numpy 步幅:

BGRim = RGBim[..., ::-1]

【讨论】:

  • 嘿伙计。检查更新的问题。我应用了您的更改,现在它只是创建了徽标的白色轮廓..
  • 你到底想做什么?是否要提取 Alpha 通道?图像是您的实际起始图像吗?预期的结果是什么?谢谢。
  • 标志不是这样的。它们是具有透明背景的彩色徽标。我想把这些标志变成灰色并粘贴它们..
  • 请点击您的问题下方的edit,并确保文字和图片符合您的要求。谢谢。
  • 他们怎么不匹配?