是否可以将此 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)
我想知道我是否可以将此 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)