边缘羽化效果
这篇教学会介绍使用 OpenCV 搭配 NumPy 的基本数学运算,透过图像遮罩的方式,实现图像边缘羽化的效果 ( 边缘模糊化效果 )。
快速导览:
因为程序中的 OpenCV 会需要使用镜头或 GPU,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda ) ,并安装 OpenCV 函数库 ( 参考:OpenCV 函数库 )。
建立边缘模糊遮罩图片
使用 np.zeros 建立黑色画布后,在画布中心加入白色的圆形,接着进行高斯模糊,就完成一张边缘模糊的遮罩图片。
import cv2
import numpy as np
mask = np.zeros((300,300,3), dtype='uint8') # 建立 300x300 的黑色畫布
cv2.circle(mask,(150,150),100,(255,255,255),-1) # 在畫布上中心點加入一個半徑 100 的白色圓形
mask = cv2.GaussianBlur(mask, (35, 35), 0) # 進行高斯模糊
cv2.imshow('oxxostudio', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
根据遮罩黑白比例,合成主角与背景
因为 OpenCV 的遮罩方法 ( 参考“图像遮罩” ) 所产生的遮罩“不具有半透明”的功能,因此如果要实现边缘渐层半透明的边缘羽化效果,必须根据黑色白色的比例进行主角与背景的混合,下方的程序码执行后,会读取一张和遮罩同样尺寸的图片,以及产生同尺寸的一张白色背景,根据遮罩的黑白比例,将白色区域套用到图片,将黑色区域套用到背景,就能产生边缘羽化的图片效果
import cv2
import numpy as np
mask = np.zeros((300,300,3), dtype='uint8')
cv2.circle(mask,(150,150),100,(255,255,255),-1)
mask = cv2.GaussianBlur(mask, (35, 35), 0)
mask = mask / 255 # 除以 255,計算每個像素的黑白色彩在 255 中所佔的比例
img = cv2.imread('mona.jpg') # 開啟圖片
bg = np.zeros((300,300,3), dtype='uint8') # 產生一張黑色背景
bg = 255 - bg # 轉換成白色背景
img = img / 255 # 除以 255,計算每個像素的色彩在 255 中所佔的比例
bg = bg / 255 # 除以 255,計算每個像素的色彩在 255 中所佔的比例
out = bg * (1 - mask) + img * mask # 根據比例混合
out = (out * 255).astype('uint8') # 乘以 255 之後轉換成整數
cv2.imshow('oxxostudio',out)
cv2.waitKey(0)
cv2.destroyAllWindows()
更换背景图案,就可以做出边缘羽化的合成效果。
微信扫码关注
抖音扫码关注