假设有36×64 网格对应权重 0~15,可以控制锐化模块的锐化程度。如何实现中心高四周递减(径向递减锐化)锐化
一、基础定义
图像均分网格:36 行 (H_GRID=36)、64 列 (W_GRID=64) 权重数组类型:uint8_t sharp_weight[36][64],值域固定 0 ~ 15,数值越大锐化强度越高 分布目标:网格几何中心权重 = 15(最强锐化),向画面四角平滑递减,可配置边缘最低锐化下限。
固定常量
- 网格中心坐标 Cx=31.5,Cy=17.5
- 画面四角到中心最大欧式距离 DISTmax≈36.0347
- 权重最大值:
MAX_WEIGHT = 15 - 高斯基准 Sigma(修正后取值DISTmax/3,保证四角权重趋近于 0) GAUSS_BASE_SIGMA=DISTmax/3
距离计算逻辑
对任意网格坐标(y,x): dx=x−Cx,dy=y−Cy 距离平方:distsq=dx2+dy2 欧式距离:dist=dx2+dy2
前提说明:代码默认网格索引(x,y)为对应图像分块几何中心;若硬件仅提供分块左上角坐标,计算偏移时需额外补偿 0.5 坐标偏移。
二、对外开放可调配置参数
全局通用参数(高斯 / 线性渐变共用)
g_Sharp_Gain全局锐化增益,浮点范围 0.0~1.0- 控制整张网格整体锐化强度;值越小整体画面越柔和,上限锁死权重 15。
g_Sharp_MinFloor边缘最低锐化地板,整数范围 0~15- 限制画面四角最小权重,避免边缘完全无锐化;浮点计算阶段提前叠加,消除量化断层。
分曲线专属控制参数(二选一使用,互不干扰)
- 高斯平滑渐变(ISP 推荐,过渡自然):
g_Gauss_Radius,范围 0.4~1.5- 数值越大,高锐化清晰区域覆盖范围越大;数值越小,仅极小中心区域保持高锐度。
- 线性快速衰减(低算力,无指数运算):
g_Linear_Atten,范围 0.3~3.0- 数值越大,从中心向四周衰减速度越快;数值越小,全图锐化强度越均匀。
三、两种权重生成算法
1. 高斯渐变权重生成(视觉过渡最优)
数学公式

浮点阶段叠加地板约束:
![]()
映射至 0~15 整数权重:

完整 C 实现函数
#include <math.h>
#include <stdint.h>
#define H_GRID 36
#define W_GRID 64
#define MAX_WEIGHT 15
const float CX_GRID = 31.5f;
const float CY_GRID = 17.5f;
const float DIST_MAX = 36.0347f;
const float GAUSS_BASE_SIGMA = DIST_MAX / 3.0f;
uint8_t sharp_weight[H_GRID][W_GRID];
// 全局可调参数
float g_Sharp_Gain = 1.0f;
uint8_t g_Sharp_MinFloor= 0;
float g_Gauss_Radius = 0.8f;
void GenSharpWeight_Gauss(void)
{
float sigma = GAUSS_BASE_SIGMA * g_Gauss_Radius;
float floor_norm = (float)g_Sharp_MinFloor / MAX_WEIGHT;
for(int y = 0; y < H_GRID; y++)
{
for(int x = 0; x < W_GRID; x++)
{
float dx = x - CX_GRID;
float dy = y - CY_GRID;
float dist_sq = dx*dx + dy*dy;
// 高斯浮点权重 [0,1]
float float_w = expf(-dist_sq / (2.0f * sigma * sigma));
// 浮点层先限制地板与上限,平滑过渡
float_w = float_w < floor_norm ? floor_norm : float_w;
float_w = float_w > 1.0f ? 1.0f : float_w;
// 映射到0~15整数权重,等价round无库依赖
float raw = float_w * g_Sharp_Gain * MAX_WEIGHT;
uint8_t w = (uint8_t)(raw + 0.5f);
w = w > MAX_WEIGHT ? MAX_WEIGHT : w;
sharp_weight[y][x] = w;
}
}
}
2. 线性衰减权重生成(低算力,无 exp 运算)
数学公式

浮点约束同高斯:

量化映射逻辑与高斯完全一致。
完整 C 实现函数
// 线性衰减专属参数
float g_Linear_Atten = 1.0f;
void GenSharpWeight_Linear(void)
{
float floor_norm = (float)g_Sharp_MinFloor / MAX_WEIGHT;
for(int y = 0; y < H_GRID; y++)
{
for(int x = 0; x < W_GRID; x++)
{
float dx = x - CX_GRID;
float dy = y - CY_GRID;
float dist = sqrtf(dx*dx + dy*dy);
// 修复后线性衰减公式,消除原边界负数失控问题
float float_w = 1.0f - g_Linear_Atten * (dist / DIST_MAX);
float_w = float_w < floor_norm ? floor_norm : float_w;
float_w = float_w > 1.0f ? 1.0f : float_w;
float raw = float_w * g_Sharp_Gain * MAX_WEIGHT;
uint8_t w = (uint8_t)(raw + 0.5f);
w = w > MAX_WEIGHT ? MAX_WEIGHT : w;
sharp_weight[y][x] = w;
}
}
}
四、加权 USM 锐化运算
权重取值 0~15,等效锐化系数为 w / 16;差值delta = 原图 - 模糊图存在正负,必须使用有符号运算,输出像素强制限幅防止亮度断层 / 溢出。 以 10bit 图像(像素范围 0~1023)为例,8bit/12bit 仅需修改PIX_MAX:
// src:原始像素 blur:高斯模糊像素 w:当前分块权重0~15
uint16_t USM_Sharp(uint16_t src, uint16_t blur, uint8_t w)
{
const int PIX_MAX = 1023;
int32_t delta = (int32_t)src - (int32_t)blur;
// 定点加权:乘权重后右移4位等效除以16
int32_t sharp_add = ((int32_t)w * delta) >> 4;
int32_t out_pix = (int32_t)src + sharp_add;
// 像素边界限幅
if(out_pix < 0) out_pix = 0;
if(out_pix > PIX_MAX) out_pix = PIX_MAX;
return (uint16_t)out_pix;
}
运算逻辑说明:
w=15:完整叠加锐化差值,中心锐化最强;w=8:仅一半锐化强度,画面中等清晰;w=0:无锐化叠加,画面完全柔和。
五、参数调参效果说明
高斯模式(人像、监控、通用场景)
g_Sharp_Gain=0.9,g_Gauss_Radius=0.5,g_Sharp_MinFloor=2仅画面中心人脸区域满锐化,四周背景快速弱化,抑制背景噪点。g_Sharp_Gain=1.0,g_Gauss_Radius=1.2,g_Sharp_MinFloor=6大面积画面保持高锐度,仅最边缘轻微衰减,适配文档、扫码场景。g_Sharp_Gain=0.5,g_Gauss_Radius=0.7,g_Sharp_MinFloor=1全局压低锐化强度,夜景低光场景,避免暗部噪点被放大。
线性模式(低算力嵌入式设备)
g_Linear_Atten=0.3:衰减极慢,整张画面锐化均匀;g_Linear_Atten=3.0:衰减极快,只有画面中心一小块具备锐化效果。
六、工程优化补充
- 内存开销:36×64 权重数组仅 2304 字节,每帧生成一次查表即可,无需逐像素实时计算距离;
- 浮点优化:可预计算距离平方 LUT、高斯指数 LUT,移除实时
sqrtf/expf,适配无 FPU 的 MCU; - 定点移植:将 Gain、Radius、Atten 转为 Q12 定点整数,全部运算替换移位、乘法,彻底消除浮点库依赖;
- 性能优化:浮点地板提前归一化处理,不在量化后抬高权重,消除低权重区域阶梯断层。
&spm=1001.2101.3001.5002&articleId=162075468&d=1&t=3&u=b1872294ec32416db3848dbd75d88d5d)
320

被折叠的 条评论
为什么被折叠?



