OpenGL ES 2.0:如何自定义卷积核实现心形、圆形等不规则形状模糊效果
自定义形状卷积核制作方法
- 第一步:确定卷积核尺寸
优先选择奇数边长的正方形核(比如5x5、15x5、31x31),尺寸越大模糊效果越明显,对应的计算量也越高。 - 第二步:建立归一化坐标系
以卷积核的中心像素为坐标原点(0,0),将所有像素的横纵坐标映射到[-1,1]的区间内,映射公式如下,假设核的边长为size:
// 核下标x_idx、y_idx从0开始计数 norm_x = (x_idx - (size - 1) / 2) / ((size - 1) / 2) norm_y = (y_idx - (size - 1) / 2) / ((size - 1) / 2)
- 第三步:按形状规则逐点赋值
对每个坐标点做「是否在形状内部」的判断,满足条件的位置赋值为1,不满足的赋值为0。以下是常见形状的判断规则:- 圆形:满足
norm_x² + norm_y² ≤ 1即为形状内部 - 心形:满足
(norm_x² + norm_y² - 1)³ - norm_x² * norm_y³ < 0即为形状内部 - 月牙形:可通过布尔运算实现,比如判定点在半径为1、中心为(0,0)的大圆内,且不在半径为0.8、中心偏移(0.3, 0)的小圆内,即为月牙内部
- 任意不规则形状:直接准备对应形状的黑白位图,缩放到和卷积核相同尺寸,直接读取每个像素的灰度值作为权重(黑色取1、白色取0、过渡灰阶取对应0~1之间的数值即可)
- 圆形:满足
- 第四步:优化与归一化
- 如果不需要硬边缘的模糊效果,可以对形状边缘做羽化处理:边界附近的点根据到形状边缘的距离赋值0~1的过渡值,避免模糊结果出现锯齿
- 所有位置赋值完成后,计算核内所有权重的总和,将每个权重除以总和完成归一化,归一化完成后再投入使用可避免模糊后图片整体亮度发生变化
基础示例参考
3x3的方框模糊核的原始形态如下:
[1,1,1] [1,1,1] [1,1,1]
归一化后每个位置的权重为1/9,和常规方框模糊的计算逻辑一致。
内容的提问来源于stack exchange,提问作者oHuflying
相关产品推荐
相关产品推荐

