У меня есть прозрачный логотип, который я хочу преобразовать в оттенки серого с помощью 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]
Эй, мужик. Проверьте обновленный вопрос. Я применил ваши изменения, и теперь он просто создает белый контур логотипа.
Что вы на самом деле пытаетесь сделать? Вы хотите извлечь альфа-канал? Является ли изображение вашим фактическим начальным изображением? Каков ожидаемый результат? Спасибо.
Логи не такие. Это цветные логотипы с прозрачным фоном. Я хочу сделать эти логотипы серыми и вставить их..
Пожалуйста, нажмите edit
под своим вопросом и убедитесь, что слова и изображения соответствуют тому, что вы хотите сделать. Спасибо.
Как они не совпадают?
Вопрос очень ясен. У меня есть логотипы, которые я хочу преобразовать в оттенки серого с помощью OpenCV.
Пожалуйста, предоставьте минимальный воспроизводимый пример, а также весь вывод ошибки.