我有一个透明的标志,我想使用 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'
我试图.convert('L')
从 PIL 中使用,但它使它成为 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
您正在不必要地混合OpenCV和PIL/Pillow,并且会混淆自己。如果你用PIL打开一个图像,你会得到一个PIL Image
对OpenCV 毫无用处的图像,因为:
Numpy arrays
, 不是PIL Images
, 和保存图像时同样适用。
有三种可能的解决方案:
转换PIL Image
为OpenCV的Numpy array
:
OCVim = np.array(PILim)
要转换的OpenCV的Numpy array
到PIL Image
:
PILim = Image.fromarray(OCVim)
要反转颜色顺序,显然不需要灰度,请使用:
BGRim = cv2.cvtColor(RGBim, cv2.COLOR_RGB2BGR)
或使用负 Numpy 步幅:
BGRim = RGBim[..., ::-1]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句