ISPPipeline中径向递减锐化方案实现(一)

        

目录        

一、基础定义

二、对外开放可调配置参数

三、两种权重生成算法

四、加权 USM 锐化运算

五、参数调参效果说明

六、工程优化补充


        假设有36×64 网格对应权重 0~15,可以控制锐化模块的锐化程度。如何实现中心高四周递减(径向递减锐化)锐化

一、基础定义

        图像均分网格:36 行 (H_GRID=36)、64 列 (W_GRID=64) 权重数组类型:uint8_t sharp_weight[36][64],值域固定 0 ~ 15,数值越大锐化强度越高 分布目标:网格几何中心权重 = 15(最强锐化),向画面四角平滑递减,可配置边缘最低锐化下限。

固定常量

  1. 网格中心坐标 Cx​=31.5,Cy​=17.5
  2. 画面四角到中心最大欧式距离 DISTmax​≈36.0347
  3. 权重最大值:MAX_WEIGHT = 15
  4. 高斯基准 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 坐标偏移。

二、对外开放可调配置参数

全局通用参数(高斯 / 线性渐变共用)

  1. g_Sharp_Gain 全局锐化增益,浮点范围 0.0~1.0
    • 控制整张网格整体锐化强度;值越小整体画面越柔和,上限锁死权重 15。
  2. g_Sharp_MinFloor 边缘最低锐化地板,整数范围 0~15
    • 限制画面四角最小权重,避免边缘完全无锐化;浮点计算阶段提前叠加,消除量化断层。

分曲线专属控制参数(二选一使用,互不干扰)

  1. 高斯平滑渐变(ISP 推荐,过渡自然):g_Gauss_Radius,范围 0.4~1.5
    • 数值越大,高锐化清晰区域覆盖范围越大;数值越小,仅极小中心区域保持高锐度。
  2. 线性快速衰减(低算力,无指数运算):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:无锐化叠加,画面完全柔和。

五、参数调参效果说明

高斯模式(人像、监控、通用场景)

  1. g_Sharp_Gain=0.9,g_Gauss_Radius=0.5,g_Sharp_MinFloor=2 仅画面中心人脸区域满锐化,四周背景快速弱化,抑制背景噪点。
  2. g_Sharp_Gain=1.0,g_Gauss_Radius=1.2,g_Sharp_MinFloor=6 大面积画面保持高锐度,仅最边缘轻微衰减,适配文档、扫码场景。
  3. g_Sharp_Gain=0.5,g_Gauss_Radius=0.7,g_Sharp_MinFloor=1 全局压低锐化强度,夜景低光场景,避免暗部噪点被放大。

线性模式(低算力嵌入式设备)

  1. g_Linear_Atten=0.3:衰减极慢,整张画面锐化均匀;
  2. g_Linear_Atten=3.0:衰减极快,只有画面中心一小块具备锐化效果。

六、工程优化补充

  1. 内存开销:36×64 权重数组仅 2304 字节,每帧生成一次查表即可,无需逐像素实时计算距离;
  2. 浮点优化:可预计算距离平方 LUT、高斯指数 LUT,移除实时sqrtf/expf,适配无 FPU 的 MCU;
  3. 定点移植:将 Gain、Radius、Atten 转为 Q12 定点整数,全部运算替换移位、乘法,彻底消除浮点库依赖;
  4. 性能优化:浮点地板提前归一化处理,不在量化后抬高权重,消除低权重区域阶梯断层。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊背

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值