自从何凯明提出导向滤波后,因为其算法的简单性和有效性,该算法得到了广泛的应用,以至于新版的matlab都将其作为标准自带的函数之一了,利用他可以解决的所有的保边滤波器的能解决的问题,比如细节增强.HDR压缩.细节羽化.去雾.风格化,而且由于其保边特性,如果很多传统函数中使用高斯滤波或者均值滤波的地方用他代替,能很好解决一些强边缘的过渡不自然问题,比如retinex.Highlight/shadow等应用中,因此,快速的实现该算法具有很强的适用意义. 本文简要的记录了本人在优化导向滤波实现的过程中…
    一.基础原理 Base64是一种用64个Ascii字符来表示任意二进制数据的方法.主要用于将不可打印的字符转换成可打印字符,或者简单的说是将二进制数据编码成Ascii字符.Base64也是网络上最常用的传输8bit字节数据的编码方式之一. 标准的Base64编码方式过程可简单描述如下: 第一步,将每三个字节作为一组,一共是24个二进制位. 第二步,将这24个二进制位分为四组,每个组有6个二进制位. 第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节. 第四步,根据下表,得到扩…
GIMP源代码链接:https://gitlab.gnome.org/GNOME/gimp/-/archive/master/gimp-master.zip GEGL相关代码链接:https://gitlab.gnome.org/GNOME/gegl/-/archive/master/gegl-master.zip 最近因为要研究下色温算法,顺便下载了最新的GIMP软件,色温算法倒是找到了(有空单独来讲下),也顺便看看GIMP都有些什么更新,嗯,更新还是蛮多的,界面UI上有很多改动,有些已经改的…
二值图像的细化算法也有很多种,比较有名的比如Hilditch细化.Rosenfeld细化.基于索引表的细化.还有Opencv自带的THINNING_ZHANGSUEN.THINNING_GUOHALL喜欢等等.这些都属于迭代的细化方式,当然还有一种是基于二值图像距离变换的细化方法,二值想比较,我个人认为是基于迭代的效果稳定.可靠,但是速度较慢,且速度和图片的内容有关,基于距离变换的版本,优点是速度稳定,但是效果差强人意.本文这里还是选择基于迭代的方式予以实现. 相关的参考文章有:http://c…
在SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现) 一文中,我曾经说过优化后的ExpBlur比BoxBlur还要快,那个时候我比较的BoxBlur算法是通过积分图+SSE实现的,我在09年另外一个博客账号上曾经提供过一篇这个文章彩色图像高速模糊之懒惰算法,里面也介绍了一种快速的图像模糊算法,这个算法的执行时间基本也是和半径无关的.在今年的SSE优化学习之路上我曾经也考虑过将该算法使用SSE实现,但当时觉得这个算法逐像素同时逐行都是前后依赖的(…
  2015年龚博士的曲率滤波算法刚出来的时候,在图像处理界也曾引起不小的轰动,特别是其所说的算法的简洁性,以及算法的效果.执行效率等方面较其他算法均有一定的优势,我在该算法刚出来时也曾经有关注,不过那个时候看到是迭代的算法,而且迭代的次数还蛮多了,就觉得算法应该不会太快,所以就放弃了对其进一步优化.最近,又偶尔一次碰触到该文章和代码,感觉还是有蛮大的优化空间的,所以抽空简单的实现他的算法.   该算法作者已经完全开源,项目地址见:https://github.com/YuanhaoGong/C…
无意中浏览一篇文章,中间提到了基于多尺度的图像的细节提升算法,尝试了一下,还是有一定的效果的,结合最近一直研究的SSE优化,把算法的步骤和优化过程分享给大家. 论文的全名是DARK IMAGE ENHANCEMENT BASED ON PAIRWISE TARGET CONTRAST AND MULTI-SCALE DETAIL BOOSTING,好像在百度上搜索不到,由于博客的空间不多了,这里就不上传了, 我贴出论文核心的字段. 论文的核心思想类似于Retinex,使用了三个尺度的高斯模糊,再…
基于value-and-criterion structure方式的实现的滤波器在原理上其实比较简单,感觉下面论文中得一段话已经描述的比较清晰了,直接贴英文吧,感觉翻译过来反而失去了原始的韵味了. The value-and-criterion filter structure  is based on the geometrical structure of mathematical morphology, but allows the use of a much wider variety…
在很多场合需要高效率的肤色检测代码,本人常用的一个C++版本的代码如下所示: void IM_GetRoughSkinRegion(unsigned char *Src, unsigned char *Skin, int Width, int Height, int Stride) { ; Y < Height; Y++) { unsigned char *LinePS = Src + Y * Stride; // 源图的第Y行像素的首地址 unsigned char *LinePD = Ski…
在颜色空间系列1: RGB和CIEXYZ颜色空间的转换及相关优化和颜色空间系列3: RGB和YUV颜色空间的转换及优化算法两篇文章中我们给出了两种不同的颜色空间的相互转换之间的快速算法的实现代码,但是那个是C#版本的,为了比较方便,我们这里提供C版本的代码,以RGB转到YUV空间的代码为例: void RGBToYUV(unsigned char *RGB, unsigned char *Y, unsigned char *U, unsigned char *V, int Width, int…