需求:使用 python 的 opencv 实现 adobe"方向模糊"同款效果,同时需要保留 png 的 alpha 通道
已查阅到的的 motion blur 实现会使得带 alpha 通道的图片异常,生成的产物是一片白的
# -*- coding: utf-8 -*-
import numpy as np
import cv2
from PIL import Image
def motion_blur(image, degree=3, angle=90):
image=image.convert("RGB")
array=np.asarray(image)
image=cv2.cvtColor(array,cv2.COLOR_RGB2BGR)
image = np.array(image)
M = cv2.getRotationMatrix2D((degree / 2, degree / 2), angle, 1)
motion_blur_kernel = np.diag(np.ones(degree))
motion_blur_kernel = cv2.warpAffine(motion_blur_kernel, M, (degree, degree))
motion_blur_kernel = motion_blur_kernel / degree
blurred = cv2.filter2D(image, -1, motion_blur_kernel)
cv2.normalize(blurred, blurred, 0, 255, cv2.NORM_MINMAX)
blurred = np.array(blurred, dtype=np.uint8)
blurred=Image.fromarray(cv2.cvtColor(blurred, cv2.COLOR_BGR2RGB),mode="RGB")
return blurred
本人不熟悉图像处理的算法,想请教一下如何改进完善这个算法使其支持带有 alpha 通道的 png 图片?
1
paopjian 2022-05-15 14:29:36 +08:00
PNG 是四通道图片啊,你第一步就把 alpha 给抹了
|
2
jaredyam 2022-05-16 10:01:51 +08:00
你这个函数包含两个部分,一部分是图像简单变换(预处理、后处理),一部分是函数核心(构造滤波器并滤波),我觉得你这个函数可以再拆。简单来看 cv2.filter2D 是逐通道(多通道可能有并行加速?)的,所以你可以:
1. 先拆出 alpha 处理完并回去; 2. 逐通道遍历滤波,只滤需要的通道,从而可以一直保持 alpha ; 至于你说的「一片白」我不是很清楚。 |
3
ch2 OP 最后使用了 pillow 的 ImageFilter 定义了一个卷积核,实现了 5*5 、角度为 90°的方向模糊
支持 png 的 alpha 通道 from PIL import Image, ImageFilter class MOTION_BLUR(ImageFilter.BuiltinFilter): name = "Motion_Blur" # fmt: off filterargs = (5, 5), 5, 0, ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ) # fmt: on img = Image.new('RGBA', (800, 600), (255, 255, 255, 0)) img.filter(MOTION_BLUR) |