GPU锐化增强算法

目前常见基于GPU实现锐化算法,大体以拉普拉斯锐化为主,区别是应用的算子略有区别,算法较为简单而得以广泛应用,而USM因其运算复杂,且锐化效果没有特别的优势,所以应用较少。 拉普拉斯锐化的核心思想是利用二阶微分,将原图像和拉普拉斯卷积后图像的高频成分叠加,增强边界的灰度值,进而实现锐化。

1. 二阶微分原理:

对于一维离散函数,其一阶微分的定义如下:

一维离散函数的二阶微分定义为:

对于二维图像,二阶微分:

x轴方向:

y轴方向:

因此:

以上,二阶微的操作分可以理解为,对图像像素点**f(x,y)**按照

算子进行卷积。

然后将卷积的结果,即提取的边缘高频成份,叠到原图像像素点上,生成锐化的图像。

根据以上,可以定义出一个二维图像的锐化过程定义为:

Laplace操作的核心思想:

一阶微分表征了在某个方向上灰度的变化率,而二阶微分表征的是一阶微分的变化情况。

二阶微分关心的是图像灰度的突变而不强调灰度缓慢变化的区域,因此,二阶微分比一阶微分边缘的定位能力更强,在边缘检测中发挥着更加重要的作用,是适合锐化图像的立项特征,

这就是拉普拉斯二阶微分算子锐化图像的核心思想。

2. 锐化方案:

2.1 方案1

直接使用RGB三通道中G通道,原因是G分量对灰度贡献最大,选取周边2个斜对角线方向进行卷积,卷积结果与原图进行mix,得到锐化结果。

2.2 方案2

变换到YUV空间后,按照Luminace通道,选取周边4个方向(水平,垂直及2条斜角对角线)中二阶差值最大的一个方向进行卷积。

将最后的卷积结果分量乘以锐化强度后,直接叠加到原图Y通道,最后变换到RGB色域。

2.3 方案3

直接使用RGB三通道按照以上算子进行锐化卷积;

将最后的卷积结果分量乘以锐化强度后,直接叠加到原图。

2.4 方案4

在方案1的基础上,分别给予水平/垂直,2斜对角线方向不同的权重,取4个方向进行卷积。

3. 锐化实现:

以上4种方案,方案1的实现原理简单,但方案2的锐化噪点更低。 方案2的锐化基于Y通道进行,即二阶微分高频分量是在灰度空间叠加。 下面基于方案2给出示意:

3.1 RGB纹理锐化

中心像素点一次采样:

ini 复制代码
"   color = texture2D(u_texRGB, v_texCoord).rgb;\n" +

周围像素点采样4个点采样:

ini 复制代码
// 仅列出一个方向
"   p1 = dot(rgb2gray, (texture2D(texRGB, texCoord + step * vec2(-1, -1)).rgb));\n" +

计算2个方向拉普拉斯二阶微分差值最值,可以直接简化为:

scss 复制代码
"   f1 = 2 * color - p1 - p4;\n" +
//省略 其他方向
"   float f = abs(f1) > abs(f2) ? f1 : f2;\n" +

计算增强分量,其中sharpness代表自定义强度:

基于FullRange情况的YUV->RGB: 可知,

ini 复制代码
"   vec3 new_color = rgb + vec3(delta, delta, delta);\n" +

以上,计算的delta直接叠加到RGB三通道上,就实现了基于RGB的锐化。

3.2 YUV纹理锐化

YUV纹理可以直接对Y通道纹理进行采样,同时需要考虑LimitRange和FullRange, 因使用的转换矩阵不同,以上算法需要区分兼容。

基于LimitRange情况的YUV->RGB如下:

基于3.1步骤,根据以上矩阵,适配的shader如下:

ini 复制代码
"   float limit_range_res = 0.0625; \n" +
"   float limit_range_scope = 1.164; \n" +
"   p1 = texture2D(texY, v_texCoord + step * vec2(-1, -1)).r - limit_range_res; \n" +
// 省略其他方向
"   f1 = 2 * color - p1 - p4;\n" +
"   float f = abs(f1) > abs(f2) ? f1 : f2;\n" +
"   float delta = sharpness * limit_range_scope * f * 0.5;\n" +
// 此处省略YUV采样计算出RGB的过程
"   vec3 new_color = rgb + vec3(delta, delta, delta);\n" +

FullRange的情况不再赘述。

喜欢本文的话,点个赞吧!

相关推荐
烦躁的大鼻嘎6 分钟前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
C++忠实粉丝23 分钟前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
用户37791362947551 小时前
【循环神经网络】只会Python,也能让AI写出周杰伦风格的歌词
人工智能·算法
福大大架构师每日一题1 小时前
文心一言 VS 讯飞星火 VS chatgpt (396)-- 算法导论25.2 1题
算法·文心一言
EterNity_TiMe_1 小时前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
机器学习之心1 小时前
一区北方苍鹰算法优化+创新改进Transformer!NGO-Transformer-LSTM多变量回归预测
算法·lstm·transformer·北方苍鹰算法优化·多变量回归预测·ngo-transformer
yyt_cdeyyds1 小时前
FIFO和LRU算法实现操作系统中主存管理
算法
alphaTao2 小时前
LeetCode 每日一题 2024/11/18-2024/11/24
算法·leetcode
kitesxian2 小时前
Leetcode448. 找到所有数组中消失的数字(HOT100)+Leetcode139. 单词拆分(HOT100)
数据结构·算法·leetcode
VertexGeek3 小时前
Rust学习(八):异常处理和宏编程:
学习·算法·rust