Неподдерживаемая глубина входного изображения: «VDepth :: Содержит (Глубина)», где «Глубина» составляет 4 (CV_32S) - PullRequest
2 голосов
/ 18 января 2020

Я пытаюсь обработать некоторые изображения в OpenCV. В частности, замена цветовых панелей с помощью следующих функций.

def green_ble_swap(image)
    im_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    im_copy = np.copy(im_rgb)
    blue = im_copy[:,:,2].copy()
    green = im_copy[:,:,1].copy()
    im_copy[:,:,2] = green
    im_copy[:,:,1] = blue
    return im_copy

Однако я получаю следующую ошибку.

> Unsupported depth of input image:
>     'VDepth::contains(depth)'
> where
>     'depth' is 4 (CV_32S)

Не уверен, что здесь ошибка.

1 Ответ

1 голос
/ 21 января 2020

Вы столкнулись с ошибкой, потому что пытаетесь выполнить 3-канальную операцию с 4-канальным изображением. В частности, ошибка возникает при попытке преобразовать изображение BGR в RGB, когда входное изображение имеет прозрачный канал. Правильный метод будет делать cv2.COLOR_BGRA2RGB вместо cv2.COLOR_BGR2RGB. Вы можете поменять местами синий и зеленый каналы, используя cv2.split(), чтобы получить каналы BGR (для 3-канального изображения) и каналы BGRA для (4-канальное изображение), а затем поменять местами каналы, используя индексирование Numpy , Вам также нужно использовать флаг cv2.IMREAD_UNCHANGED при загрузке изображения, иначе альфа-канал будет сброшен. Пример:

Вход -> Выход

image image

import cv2
import numpy as np

def green_blue_swap(image):
    # 3-channel image (no transparency)
    if image.shape[2] == 3:
        b,g,r = cv2.split(image)
        image[:,:,0] = g
        image[:,:,1] = b
    # 4-channel image (with transparency)
    elif image.shape[2] == 4:
        b,g,r,a = cv2.split(image)
        image[:,:,0] = g
        image[:,:,1] = b
    return image 

# Load image
image = cv2.imread('1.png', cv2.IMREAD_UNCHANGED)
cv2.imshow('image', image)

# Swap channels
swapped = green_blue_swap(image)
cv2.imshow('swapped', swapped)
cv2.waitKey()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...