是否可以将此 OpenCV 翻译成 Pillow?

Is it possible to translate this OpenCV into Pillow?

我想知道我是否可以将此 opencv-python 方法转换为 Pillow 因为我被迫进一步处理它在 枕头.

我想到的解决方法是用 OpenCV 保存它,然后用 Pillow 加载它,但我正在寻找一个更清洁的解决方案,因为我使用 remove_background() 方法的输出作为 GIF 每一帧的输入。因此,我会无缘无故地读写图像N * GIF_frames_count

我想从Pillow转换成opencv-python的方法:

def remove_background(path):
    img = cv2.imread(path)

    # Convert to gray
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # Threshold input image as mask
    mask = cv2.threshold(gray, 250, 255, cv2.THRESH_BINARY)[1]

    # Negate mask
    mask = 255 - mask

    # Apply morphology to remove isolated extraneous noise
    # Use border constant of black since foreground touches the edges
    kernel = np.ones((3, 3), np.uint8)
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

    # Anti-alias the mask -- blur then stretch
    # Blur alpha channel
    mask = cv2.GaussianBlur(mask, (0, 0), sigmaX=2, sigmaY=2, borderType=cv2.BORDER_DEFAULT)

    # Linear stretch so that 127.5 goes to 0, but 255 stays 255
    mask = (2 * (mask.astype(np.float32)) - 255.0).clip(0, 255).astype(np.uint8)

    # Put mask into alpha channel
    result = img.copy()
    result = cv2.cvtColor(result, cv2.COLOR_BGR2BGRA)
    result[:, :, 3] = mask

    return result

代码取自:

而不是 re-writing 所有代码都使用 PIL 等效项,您可以采用 “如果它没有损坏,请不要修复它 格言,并简单地将现有代码生成的 Numpy array 转换为可用于后续目的的 PIL Image

这就是 答案中描述的内容,我将其解释为:

# Make "PIL Image" from Numpy array
pi = Image.fromarray(na)

请注意,链接的答案是指 scikit-image(它使用像 PIL 这样的 RGB 顺序)而不是 OpenCV,所以还有一个额外的问题,您还需要将通道从 BGRA 重新排序为 RGBA,所以最后几行看起来像:

...
...
result = cv2.cvtColor(result, cv2.COLOR_BGR2RGBA)
result[:, :, 3] = mask
pi = Image.fromarray(result)