Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【短道速滑十】非局部均值滤波的指令集优化和加速(针对5*5的搜索特例,可达到单核1080P灰度图 28ms/帧的速度)。

【短道速滑十】非局部均值滤波的指令集优化和加速(针对5*5的搜索特例,可达到单核1080P灰度图 28ms/帧的速度)。

作者头像
用户1138785
发布于 2023-10-16 11:45:32
发布于 2023-10-16 11:45:32
44000
代码可运行
举报
运行总次数:0
代码可运行

       非局部均值滤波(Non Local Means)作为三大最常提起来的去燥和滤波算法之一(双边滤波、非局部均值、BM3D),也是有着很多的论文作为研究和比较的对象,但是也是有着致命的缺点,速度慢,严重的影响了算法的应用范围。目前在已有的文献中尚未看到在不对算法的本质原理上做更改的情况下,能取得实时的效果,本文呢,也不求得到这个目的,只是对现有的开放的资源上来取得更进一步的提升。

  标准的NL-Means算法中,一般有三个参数,搜索半径SearchRadius,块半径PatchRadius,以及一个决定平滑程度的高斯函数参数Delta。在百度上能够搜索到的大部分文章所描述的提速算法都是使用积分图来提升NL-Means的速度,这也是目前来说唯一比较靠谱的优化技术,通过积分图,可以做到算法和块半径PatchRadius的大小基本无关,和Delta也无关,和SearchRadius成平方关系。

  因此,在我们很多的严重的噪音图像中,SearchRadius至少需要取到7以上(涉及15*15= 225个领域范围)才有明显的效果,因此,这就相当于要计算225次全图的某种计算,即使是每次这种计算只需要1ms(通常,任何图像处理算法无法超越同等内存大小的memcpy的大小的),也需要225ms的,因此,确实比较感尴。

  通过多线程方式可以适当对这个过程进行加速,毕竟每个像素点的处理相对来说还是独立的,但是,这个加速也收到物理核心的限制,就是8核的机器,满利用,也无法达到8倍的加速效果。

       话说回来,这么大的计算量,用GPU也都是很吃力的。

  目前使用积分图来记性NL-Means算法的比较好的文章也是大家常看的还是这一篇:

非局部均值滤波(NL-means)算法的积分图加速原理与C++实现

  其实积分图一直有个问题,可能很多搞图像的人都没有注意到,或者说这个问题可能对某些算法的影响还不是很大,不足有对大家注意到或者关注到,即积分图存在着一下2个方面的问题和缺点:

1、当图像较大时,积分图无法使用int类型来保存,我们必须选择能够容纳更大数据范围的数据类型来存储。

  如果我们保存的是一副字节图像的积分图,考虑极端情况,每个图像的值都是255,则积分图像最多只可保存uint.Maxvalue / 255 = 16843009个像素,大约4100*4100大小的图像,一般来说,这个规模对于实际的应用来说是足够了。

  但是我们在实际中用到的很多情况,不是直接的图像积分图,还常用的有平方积分图,即求图像平方值后的积分图,这个时候每一个元素的最大值达到了65025,极限情况下uint类型只可保存uint.Maxvalue / 255 =66051个元素的总和,只大概是指256*256个图像的大小了,已经远远的无法满足实际的应用需求。

  因此,为了实现这个要求,我们必须选择能够容纳更大数据范围的数据类型,这里有三个选择:long long(int64) / float / double

  第一个long long类型,即64位的整形数据,这个数据的表达范围已经完全够我们在图像中使用积分图了,而且保存的数据是非常准确的,特别是对于图像方面的数据来说(都是整形的),但是有个致命的问题: 速度相当相当的慢,特别是同样的计算和int类型比较的话,那真的不是一个档次上的。我一直不太理解,现在大部分都是64位系统,为什么对64位的数据的支持还是这么的弱。而且我们看大部分指令集优化的函数对64位整形的支持都比较少。因此,非常不建议使用这个类型。

  第二个float类型。如果使用这个类型,保存的数据范围是没有什么大的问题的,我们在网络上看到的文章大部分也是使用这个类型来保存结果的。但是,我在实践中多次遇到用float类型得不到正确的结果的问题,后来发现核心的原因是float的计算精度严重不足,特别是对于积分图这种连续的加法的计算,累计误差会越来越严重,当计算量足够大时,就会出现明显的误差瑕疵。因此,这个数据类型从本质上来说,对积分图是不够安全的。

  关于这一点,实际上已经有不少作者注意到了,我在博文:SSE图像算法优化系列十四:局部均方差及局部平方差算法的优化 中也有提及。

  第三个是double类型,这个类型也是64位的,因此,数据范围毫无问题,计算精度经过测试,也是没有什么问题的,而且,编译器和指令集的支持和优化做的都还很不错, 因此,个人认为这个数据类型是用来保存积分图最为合适的类型,但是有一个不友好的特点,计算速度慢,而且指令集对其能加速的空间有限。

  2、积分图虽然能做到某些算法和参数无关,但是其并不是最佳的最速度

  使用积分图技术,首先是要分配积分图占用的那部分额外的内存(而且是相当客观的内存),其次,积分图本身的计算也是需要一定时间的。还有,积分图的计算必须对边界部分做特别的判断,这个当参数较大时,计算量有的时候还是相当可观的。

  还是回到我们的非局部均值滤波上吧。上面说了这么多,意思就是虽然非局部均值可以用积分图去优化,但是还是不是很好,那有没有更好的更快的实现呢,其实在我的下面两篇博客里就已经有了相关的技术。

  一是 : SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)

       二是: SSE图像算法优化系列十四:局部均方差及局部平方差算法的优化

  因为非局部均值里使用的积分图是差的平方的积分图,因此我们只要对上述参考博文一里面的参与积分的数据稍微换一下即可,一个简单的C++代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//    SearchRadius    搜索的领域半径
//    PatchRadius      计算相似度的块的半径
//    Delta     高斯平滑的参数
int IM_NLM_Denoising(unsigned char *Src, unsigned char *Dest, int Width, int Height, int Stride, int SearchRadius, int PatchRadius, float Delta)
{
    int Status = IM_STATUS_OK;
    int Channel = Stride / Width;
    if (Src == NULL)                        return IM_STATUS_NULLREFRENCE;
    if ((Width <= 0) || (Height <= 0))        return IM_STATUS_INVALIDPARAMETER;
    if ((Channel != 1))                        return IM_STATUS_INVALIDPARAMETER;    

    int ExpandW = Width + SearchRadius + PatchRadius + SearchRadius + PatchRadius;
    int ExpandH = Height + SearchRadius + PatchRadius + SearchRadius + PatchRadius;
    int DiffW = Width + PatchRadius + PatchRadius;
    int DiffH = Height + PatchRadius + PatchRadius;

    float *Weight = (float *)calloc(Width * Height , sizeof(float));
    float *Sum = (float *)calloc(Width * Height , sizeof(float));
    int *ColValue = (int *)malloc((Width + PatchRadius + PatchRadius) * sizeof(int));
    unsigned char *Expand = (unsigned char *)malloc(ExpandH * ExpandW * sizeof(unsigned char));
    if ((Weight == NULL) || (Sum == NULL) || (ColValue == NULL) || (Expand == NULL))
    {
        Status = IM_STATUS_OUTOFMEMORY;
        goto FreeMemory;
    }
    Status = IM_GetExpandImage(Src, Expand, Width, Height, Stride, ExpandW, SearchRadius + PatchRadius, SearchRadius + PatchRadius, SearchRadius + PatchRadius, SearchRadius + PatchRadius, IM_EDGE_MIRROR);
    if (Status != IM_STATUS_OK)    goto FreeMemory;

    int Area = (2 * PatchRadius + 1) * (2 * PatchRadius + 1);
    float Inv = -1.0f / Area / Delta / Delta;


    for (int YY = -SearchRadius; YY <= SearchRadius; YY++)
    {
        for (int XX = -SearchRadius; XX <= SearchRadius; XX++)
        {
            for (int Y = 0; Y < Height; Y++)
            {
                float *LinePS = Sum + Y * Width;
                float *LinePW = Weight + Y * Width;
                unsigned char *LinePE = Expand + (Y + YY + SearchRadius + PatchRadius) * ExpandW + XX + SearchRadius + PatchRadius;
                if (Y == 0)
                {
                    memset(ColValue, 0, DiffW * sizeof(int));
                    for (int Z = -PatchRadius; Z <= PatchRadius; Z++)
                    {
                        unsigned char *LineP1 = Expand + (Z + PatchRadius + YY + SearchRadius) * ExpandW + XX + SearchRadius;
                        unsigned char *LineP2 = Expand + (Z + PatchRadius + SearchRadius) * ExpandW + SearchRadius;
                        for (int X = 0; X < DiffW; X++)
                        {
                            int Value = LineP2[X] - LineP1[X];
                            ColValue[X] += Value * Value;
                        }
                    }
                }
                else
                {
                    unsigned char *LineOut1 = Expand + (Y - 1 + YY + SearchRadius) * ExpandW + XX + SearchRadius;
                    unsigned char *LineOut2 = Expand + (Y - 1 + SearchRadius) * ExpandW + SearchRadius;
                    unsigned char *LineIn1 = Expand + (Y + PatchRadius + PatchRadius + YY + SearchRadius) * ExpandW + XX + SearchRadius;
                    unsigned char *LineIn2 = Expand + (Y + PatchRadius + PatchRadius + SearchRadius) * ExpandW + SearchRadius;
                    for (int X = 0; X < DiffW; X++)
                    {
                        int Out = LineOut2[X] - LineOut1[X];
                        int In = LineIn2[X] - LineIn1[X];
                        ColValue[X] -= Out * Out - In * In;                                    //    更新列数据
                    }
                }
                int SumA = IM_SumofArray(ColValue, PatchRadius * 2 + 1);                //    处理每行第一个数据    
                float W = IM_Fexp(SumA * Inv);
                LinePW[0] += W;
                LinePS[0] += W * LinePE[0];
                for (int X = 1; X < Width; X++)
                {
                    SumA = SumA - ColValue[X - 1] + ColValue[X + PatchRadius + PatchRadius];
                    float W = IM_Fexp(SumA * Inv);
                    LinePW[X] += W;
                    LinePS[X] += W * LinePE[X];
                }
            }
        }
    }
    for (int Y = 0; Y < Height; Y++)
    {
        int Index = Y * Width;
        unsigned char *LinePD = Dest + Y * Stride;
        for (int X = 0; X < Width; X++)
        {
            LinePD[X] = Sum[Index + X] / (Weight[Index + X]);
        }
    }
FreeMemory:
    if (Expand != NULL)            free(Expand);
    if (Weight != NULL)            free(Weight);
    if (Sum != NULL)               free(Sum);
    if (ColValue != NULL)         free(ColValue);
    return Status;
}

  对于常用的搜索半径为10,块半径为3, 500 * 500的灰度图耗时大概是500ms, 相当的慢啊。 

  通过我一系列博文里的资料,可以知道上面的循环内的代码其实是很容易进行指令集优化的,基本上我那个方框模糊的优化是同一个技巧,经过指令集优化后,500*500的灰度图的耗时大概在200ms左右,如果加上线程技术,可以优化到75ms左右,这个时间和 非局部均值滤波(NL-means)算法的CUDA优化加速 文章里提的CUDA的优化速度基本已经差不多了。

  另外,在搜索半径较小时,一种可行的优化方式是进行行列分离的卷积,即先计算中心行的结果,然后已这个结果为原始数据,在计算列方向的卷积,注意不是同时计算中心列和中心行的累加,而是有顺序的,这样就可以利用到周边领域所有的信息,这个时候计算量就会大为下降,计算的耗时也可以明显提高。这种优化方式必须测试是否对去燥的效果有很大的影响,因为他有可能会产生较为明显的水平或垂直线条效果。

  另外,如果搜索半径较大,还可以尝试在上述基础上再进行45度和135度两个方向的卷积,以便抵消这种线条效果,同样提速也还是很明显的。

  作为一个特例,有些情况下我们可能需要搜索半径为2,块大小也为2的非局部均值滤波,这种尺寸的滤波对于高强度的高斯噪音是没有什么去燥效果的,但是对于小规模的噪音,比如一般视频会议中的噪音还是有较强的抑制作用,因此,也还是有应用场景的,但是这种场景对算法的速度提出了极高的要求,如果考虑流畅性,给这个算法的处理不易超过20ms, 而现在的视频流越来越高清了,因此,对这个算法的优化处理就必须做的更到位。

  针对这个特例,我又做了一些优化,首先,因为是小半径,所以可以使用行列分离的算法,即先计算如下区域的合成结果:

   计算得到中间的结果后再通过中间结果计算下述区域的合成结果作为最终值:

  这里面的优化技巧有很多很多。 

  我这里提几个想法供参考:  

  1、中心点C的处的权重不需要计算,因为必然为1。

  2、在进行水平计算时,去除掉中线后,只有4个点了,PP/P/N/NN,我们可以通过一些组合手段把他们的权重以及权重乘以值的量一次性计算出来,这样就可以直接把中间值给搞定了,如此做的好处是,不用多次保存累加的权重值和乘以值,也就是说舍弃掉了前面代码里的Weight和Sum变量,这对算法速度的提高也是有极大的贡献的,垂直的计算也是一样的。 

       3、那个exp函数是个比较耗时的函数,在http://martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-c-c/中一个比较快速的函数,虽然精度一般,但是经过测试,可以满足本算法的需求,但是其计算量小很多。

  4、去掉中心点后,无论在垂直或者水平方向都只有4个数据,这为SIMD指令的某些读取和优化提供了无尚的便利和方便,而有些数据真的是巧合加天工设计,比如水平方向处理时,我们需要一次性处理4个点(出去中间那个),而我们用_mm_loadl_epi64恰好可以读取8个字节,这个时候,读取的8个字节如下:

        A0   A1   A2   A3   A4   A5   A6   A7

  正好可以组成4对5个组合 :

          A0  A1  A2  A3  A4

          A1   A2   A3   A4   A5 

          A2   A3  A4   A5   A6

          A3   A4  A5   A6       A7

  如果多一个字节,都不好处理了(主要是不好读取),多么完美的事情啊。

  通过多种优化方式后,对于常见的1080P视频(1920*1080),处理其Y分量(灰度)耗时能做到28ms了,如果使用2个线程或4个线程,则可以完全满足实时的需求,如果是720P的视频,则单核也能到20ms。

   提供两个测试DEMO做速度比较吧:

         5X5的特例非局部均值去燥Demo:  https://files.cnblogs.com/files/Imageshop/NL-Means5x5.rar?t=1696752228&download=true

      任意尺寸的非局部均值去燥Demo:  https://files.cnblogs.com/files/Imageshop/NL-Means.rar?t=1696752228&download=true

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
13行代码实现最快速最高效的积分图像算法。
本文介绍了基于积分图像的计算机图像处理技术,包括其基本概念、操作步骤和应用场景。通过积分图像,可以方便地进行图像的局部特征提取和图像处理,包括图像滤波、边缘检测、图像分割和特征提取等。同时,本文还介绍了一些常用的积分图像处理算法,包括卷积、高斯滤波、Canny边缘检测和霍夫变换等。这些算法在计算机视觉和图像处理领域都有广泛的应用,对于图像处理的效果和性能有着重要的影响。
用户1138785
2018/01/03
1.9K0
13行代码实现最快速最高效的积分图像算法。
学习《Hardware-Efficient Bilateral Filtering for Stereo Matching》一文笔记。
根据文章内容总结摘要。
用户1138785
2018/01/03
1.1K0
学习《Hardware-Efficient Bilateral Filtering for Stereo Matching》一文笔记。
【短道速滑二】古老的基于亮度平均值的自动Gamma校正算法。
在github上搜索代码Auto Gamma Correction,找到一个比较古老的代码,详见:https://github.com/PedramBabakhani/Automatic-Gamma-Correction,配套的代码使用VHDL语言写的,看了半天一个for循环没有,是在看不懂,幸好里面有篇算法对应的论文下载,论文名字叫《ASIC implementation of automatic gamma correction based on average of brightness 》,下载看了下,大概搞明白了他的大概意思。
用户1138785
2020/07/27
1.2K0
再谈快速的高斯模糊算法(使用多次均值滤波逼近和扩展的二项式滤波滤波器)及其优化。
  一个是递归的IIR滤波器,一个Deriche滤波器,他们的速度都已经是顶级的了,而且都能够使用SIMD指令优化,其中有讲到《Recursive implementation of the Gaussian filter》这个方法在半径较大的时候会出现一定的瑕疵,核心原因是大半径会导致其中的某些系数特别小,因此造成浮点精度的丢失,因此,要保证效果就必须在计算过程中使用double数据类型,而使用了double,普通的sse指令集的增速效果就不是很明显了,因此,为了速度可能需要使用AVX或者更高的AVX512。
用户1138785
2022/09/21
2K0
再谈快速的高斯模糊算法(使用多次均值滤波逼近和扩展的二项式滤波滤波器)及其优化。
图像处理基础-均值滤波
图像处理中,有几种常见的基础算法,比如“模糊”、“灰度”、“浮雕”、“黑白”、“底片”、“锐化”。这篇文章讲述采用“均值滤波”的算法实现“模糊”。
公号sumsmile
2020/10/29
1.5K0
图像处理基础-均值滤波
基于局部均方差相关信息的图像去噪及其在实时磨皮美容算法中的应用。      在1979年Lee发表的论文《Lee Filter Digital Image Enhancement and Noise
该文就目前技术社区中比较流行的图像磨皮算法的实现进行介绍,分析了其原理、效果以及优缺点,并给出了基于深度学习的图像磨皮算法的实现流程。
用户1138785
2018/01/03
1.6K0
基于局部均方差相关信息的图像去噪及其在实时磨皮美容算法中的应用。
	     在1979年Lee发表的论文《Lee Filter Digital Image Enhancement and Noise
四种比较简单的图像显著性区域特征提取方法原理及实现-----> AC/HC/LC/FT。
本文探讨了四种显著性检测算法及其在图像处理中的应用。首先介绍了显著性检测的背景和意义,然后详细阐述了基于高斯差分(OGD)、全局统计(GS)、局部自适应(LOA)和自适应阈值(AT)四种显著性检测算法的原理和实现。文章还对各种算法的优缺点进行了分析,并通过实验对四种算法的性能进行了评估。
用户1138785
2018/01/03
3.6K0
四种比较简单的图像显著性区域特征提取方法原理及实现-----> AC/HC/LC/FT。
【工程应用十二】Bayer图像格式中Hamilton-Adams及Zhang Wu 基于LMMSE算法的Demosaic过程优化。
  Demosaic,中文直接发翻译为去马赛克, 但是其本质上并不是去除马赛克,这让很多第一次接触这个名词或者概念的人总会想的更多。因此,一般传感器在采集信息时一个位置只采集RGB颜色中的一个通道,这样可以减少采集量,降低成本,由于人的视觉对绿色最为敏感,所以一般情况下,绿色分量会比红色和蓝色分量多一倍的信息,这样,根据RGB不同的位置排布,就产生了RGGB、GBRG、GRBG、BGGR四种常用的模式,比如RGGB模式就如下所示:
用户1138785
2024/09/03
2260
【工程应用十二】Bayer图像格式中Hamilton-Adams及Zhang Wu 基于LMMSE算法的Demosaic过程优化。
非局部均值滤波算法[通俗易懂]
首先谈一下什么是非局部均值滤波。在此之前,我们先来看一下均值滤波的原理。 #####均值滤波
全栈程序员站长
2022/08/31
1.7K0
非局部均值滤波算法[通俗易懂]
AVX图像算法优化系列二: 使用AVX2指令集加速查表算法。
  查表算法,无疑也是一种非常常用、有效而且快捷的算法,我们在很多算法的加速过程中都能看到他的影子,在图像处理中,尤其常用,比如我们常见的各种基于直方图的增强,可以说,在photoshop中的调整菜单里80%的算法都是用的查表,因为他最终就是用的曲线调整。
用户1138785
2022/10/28
1.6K0
AVX图像算法优化系列二: 使用AVX2指令集加速查表算法。
CVPR论文《100+ Times Faster Weighted Median Filter (WMF)》的实现和解析
【GiantPandaCV导语】由于太硬核,小编已经写不出来导语了。 请直接阅读正文。本文首发于博客园https://www.cnblogs.com/Imageshop/p/9934670.html,然后ImageShop博主授权本公众号以他原创名义发布本篇文章,请勿恶意点举报,谢谢合作。
BBuf
2021/01/08
1K0
【短道速滑十】从单幅图像中评估加性噪音的均方差。
  estimate_noise estimate_noise — Estimate the image noise from a single image.
用户1138785
2023/01/05
6060
【短道速滑十】从单幅图像中评估加性噪音的均方差。
【短道速滑】OpenCV中cvResize函数使用双线性插值缩小图像长宽大小一半时速度飞快(比最近邻还快)之异象解析和自我实现。
作者网名:laviewpbt 是图像处理,算法实现与加速优化方面的大神!其开发的imageshop软件大小只有1MB,却实现了非常丰富与复杂的各种图像处理功能, 邮箱地址为:Email: laviewpbt@sina.com 博客地址:https://www.cnblogs.com/Imageshop/
OpenCV学堂
2020/03/31
9380
《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)
用户1138785
2018/01/03
2.9K1
《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)
【AI PC端算法优化】一,一步步优化RGB转灰度图算法
公众号输入 「高性能计算」 关键词获取刘文志大佬的《并行编程方法与优化实践》电子书以及我整理的SSE指令集PDF。
BBuf
2020/04/15
1.7K0
【AI PC端算法优化】一,一步步优化RGB转灰度图算法
SSE图像算法优化系列二:高斯模糊算法的全面优化过程分享(一)。
根据文章内容总结的摘要
用户1138785
2018/01/03
2.2K0
SSE图像算法优化系列二:高斯模糊算法的全面优化过程分享(一)。
深度优化局部拉普拉斯金字塔滤波器。
基于局部拉普拉斯金字塔的Edge-aware滤波器是在2011年由Adobe 公司的研究员Sylvain Paris(大神级人物,写了很多文章)提出的,我在4年前曾经参考有关代码实现过这个算法,但是速度也是非常慢的,所以当时也没有继续做深入的研究,前段时间做另外一个算法时仔细的研究了下高斯和拉普拉斯金子塔的优化,因此又抽时间仔细的分析了算法的论文和代码,由于论文的理论部分还有一些我没有想清楚,因此在这里我只对研读过程中涉及的代码方面的优化做个解读。
OpenCV学堂
2019/03/07
2.5K0
Opencv中goodFeaturesToTrack函数(Harris角点、Shi-Tomasi角点检测)算子速度的进一步优化(1920*1080测试图11ms处理完成)。
  搜索到某个效果很好的视频去燥的算法,感觉效果比较牛逼,就是速度比较慢,如果能做到实时,那还是很有实用价值的。于是盲目的选择了这个课题,遇到的第一个函数就是角点检测,大概六七年用过C#实现过Harris角点以及SUSAN角点。因此相关的理论还是有所了解的,不过那个时候重点在于实现,对于效率没有过多的考虑。
用户1138785
2023/11/02
6150
Opencv中goodFeaturesToTrack函数(Harris角点、Shi-Tomasi角点检测)算子速度的进一步优化(1920*1080测试图11ms处理完成)。
Python opencv图像处理基础总结(二) ROI操作与泛洪填充 模糊操作 边缘保留滤波EPF
ROI(Region Of Interest),感兴趣区域,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,经常用来连接图像。
叶庭云
2020/09/17
3.2K0
Python  opencv图像处理基础总结(二)  ROI操作与泛洪填充  模糊操作  边缘保留滤波EPF
一种快速简便优秀的全局曲线调整与局部信息想结合的非线性彩色增强算法(多图深度分析和探索)
  本文的分析基于《Adaptive and integrated neighborhood-dependent approach for nonlinear enhancement of color images》一文相关内容,但对其进行了深度的改良。
用户1138785
2019/10/15
1.1K0
一种快速简便优秀的全局曲线调整与局部信息想结合的非线性彩色增强算法(多图深度分析和探索)
推荐阅读
13行代码实现最快速最高效的积分图像算法。
1.9K0
学习《Hardware-Efficient Bilateral Filtering for Stereo Matching》一文笔记。
1.1K0
【短道速滑二】古老的基于亮度平均值的自动Gamma校正算法。
1.2K0
再谈快速的高斯模糊算法(使用多次均值滤波逼近和扩展的二项式滤波滤波器)及其优化。
2K0
图像处理基础-均值滤波
1.5K0
基于局部均方差相关信息的图像去噪及其在实时磨皮美容算法中的应用。      在1979年Lee发表的论文《Lee Filter Digital Image Enhancement and Noise
1.6K0
四种比较简单的图像显著性区域特征提取方法原理及实现-----> AC/HC/LC/FT。
3.6K0
【工程应用十二】Bayer图像格式中Hamilton-Adams及Zhang Wu 基于LMMSE算法的Demosaic过程优化。
2260
非局部均值滤波算法[通俗易懂]
1.7K0
AVX图像算法优化系列二: 使用AVX2指令集加速查表算法。
1.6K0
CVPR论文《100+ Times Faster Weighted Median Filter (WMF)》的实现和解析
1K0
【短道速滑十】从单幅图像中评估加性噪音的均方差。
6060
【短道速滑】OpenCV中cvResize函数使用双线性插值缩小图像长宽大小一半时速度飞快(比最近邻还快)之异象解析和自我实现。
9380
《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)
2.9K1
【AI PC端算法优化】一,一步步优化RGB转灰度图算法
1.7K0
SSE图像算法优化系列二:高斯模糊算法的全面优化过程分享(一)。
2.2K0
深度优化局部拉普拉斯金字塔滤波器。
2.5K0
Opencv中goodFeaturesToTrack函数(Harris角点、Shi-Tomasi角点检测)算子速度的进一步优化(1920*1080测试图11ms处理完成)。
6150
Python opencv图像处理基础总结(二) ROI操作与泛洪填充 模糊操作 边缘保留滤波EPF
3.2K0
一种快速简便优秀的全局曲线调整与局部信息想结合的非线性彩色增强算法(多图深度分析和探索)
1.1K0
相关推荐
13行代码实现最快速最高效的积分图像算法。
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验