听他们讲中值滤波或双方滤波形式的图像去雾效果的钻研。

by admin on 2019年3月10日

“年纪再大学一年级些后头,梦想就像烈酒。”

90后,感觉已经是2个很古老的公家名词了么?从当时的“非主流”到明天的“小学生”,中间不知不觉已经离世了十年,最早的90后一度二十七周岁了,奔三了。即使仍算是青春岁月(相对来说),想来却有一种“寒来暑往,暮去朝来”的觉得。

早已的刘星,未来的张一山(Zhang Yishan)

一九九九年大家认识了任贤齐(Ren Xianqi),我们听着《心太软》,《对面包车型地铁女孩看过来》;

1999年大家照旧个幼园的小家伙,这一年十月七日,被United Kingdom攻城掠地了很久的Hong Kong回来了祖国的胸怀。大家上了小学一年级,认识了谢柠檬。看了一部《天龙八部》,那时候还收藏了剧中的留念;

1999年,姜伟的《还珠格格》在电视上播出,大家唱着《当》和《雨蝶》,喜欢夏紫薇福尔康小燕子五阿哥,我们了然了林心如(Lin Xinru)周杰赵薇(zhào wēi )苏有朋先生,喜欢他们,春晚那英(Na Ying)王菲(wáng fēi )相约98;

1998年四月13日被西班牙(Spain)攻城掠地的长春回归了,那时候有一首歌叫七子之歌,“你可见MACAU,不知本人真姓。”《还珠格格》第一部也播出了,大家喜爱晴儿王艳,跳舞会引蝴蝶的含香刘丹。可是,还珠2刚播出,这么些引蝴蝶的香妃娘娘就出车祸离大家而去。后来看了晴格格王艳的《青河绝恋》。后来谢霆锋(英文名:xiè tíng fēng)红了,大家欣赏谢霆锋(Nicholas Tse)和他的歌,买她的海报。后来,张柏芝(Zhang Bozhi)红了,再后来我们买带歌词的卡片,收集。羽泉也红了,大家听着他俩的《最美》,《狂暴到底》。大家也明白了杰伊 Chou,喜欢周杰伊(英文名:zhōu jié lún)的歌。

《还珠格格》香妃

三千年我们看了美剧《花青生死恋》,被素面朝天的宋慧教圈粉。

二〇〇三年申办奥运会成功了,全国人民都庆祝申奥成功,追了一部《封神榜之爱子情深,忠义乾坤》、《四大名捕斗将军》。

贰零零叁年《风浪雄霸天下》和《风浪2》,大家上三年级的时候,有了第①部青春偶像剧《流星花园》,F4和杉菜,道明寺,南门,花泽类,美作。买了多如牛毛流星花园的事物,四年级,另一部偶像剧《薰衣草》播出。买薰衣草瓶,收藏。同年,大家追《情深深雨蒙蒙》喜欢方瑜。

二零零三年,大家经历了国家首领换届,非典SA宝马X5S。这年正是大家小学就快毕业了。课都不上了,高校给大家分为多少个小组,派代表去老师那领作业,交作业。同心协力,一德一心,科学防治,抗击非典。非典结束了,大家结束学业了。看了一部《萧十一郎》和《极度公民》。

二〇〇三年7月,大家上了初级中学,经历了军事磨练。我们的教科书和80后的都如出一辙,我们学的美式保加利亚语,李雷韩梅梅双胞胎露茜莉莉的故事,到了下一届就改教材了。看了《射雕英豪传李亚鹏周迅(zhōu xùn )版》。

贰零零壹年的《大唐双龙传》《情定安达曼海》。

二〇〇六年,禽流行性脑仁疼蔓延。大家望着《爱情魔发师》、《王子变青蛙》,喜欢明道(英文名:míng dào),小红恩。大家追着《恶作剧之吻》和《天若有情》,喜欢上了董洁(Dong Jie)和南朝鲜歌星车仁表。初三那年,大家望着《十7周岁的天幕》。这一年,大家初级中学结业生升学考试,而剧中讲的高三即将高等高校统招考试。大家喜爱李智楠,保剑锋,还有清纯可人的蓝菲林。

《十捌周岁的苍天》蓝菲林

二零零七年,我们上了高级中学,看了各州版威尼斯绿生死恋《爱在分别时》。

二零零七年,我们追着《恶作剧二吻》,喜欢江直树与袁湘琴。

二〇〇八年奥林匹克运动年,年底,南方暴发了雪灾,三月7日汶四川大学地震,九月30日首都奥林匹克。

二零一零年,大家毕业了,一部《一起来看流星雨》认识了张翰(Hans Zhang)等新型,上了高校,喜欢了郑爽(Zheng Shuang)。

贰零零玖年华盛顿亚运,有了第③部《一起又看流星雨》和《一非常大心爱上您》

二零一一年北京世界博览会。

二〇一三年大家大学结业了,有了办事,上了班。

咱俩是率先批即将老去的90后。  

笔者们望着周星驰的摄像长大,星仔随着岁月老去

  壹 、定义F(X)=A(1-t(x)),称之为大气光幕或然为雾浓度。

“时间是杀身之祸,深恶痛疾”

关于大家这一代,被贴上无数标签:

御宅族、懒癌病人、月光族、白日造梦家,吃货、中二病、福尔摩哥综合症、网聊综合症…………

小编们看着《大话西游》2遍再一次地被重放,时辰候不懂的紫霞,到了稍稍年后,再看这一幕,忽然泪如雨下;

《大话西游》紫霞仙子说:“小编的意中人是个盖世英豪。”

曾不顾一切的求偶过的,后来变的一钱不值。

幼时哭闹着的企盼,有的完成了一部分没有了;父母曾百般阻挠的事,直到自个儿受伤,才精通,父母原来是对的。

在家里,父母对大家百依百顺,出了家门,我们对社会百依百顺。

厌恶的事体也就逐步习惯了。

曾无多次的问过本人,为啥活着?到新兴,已经懒得的去想活着的意思。

曾为了爱情可以糟糕好的开卷,到新兴为了工作得以丢下爱情。

原来年轻会老。

原先再凶悍的奸人,后来也都堙没星辰大海不再出彩。

原先那多少个年少轻狂的梦,后来都忘了。


正文为原创稿件,如有雷同,多是巧合

码字不易,转发请评释出处,感激。

愿不将就的大家,不忘初心,活得有滋有味。

♥      @猫姑娘小妖

三 、算法的机能

 
 从作用上看,笔者所列举的这么些事例都依然不错的,尤其是率先幅图,用何凯明的暗通道作者一向未曾调出那种功用。

                   
 图片 1

 图片 2  图片 3  图片 4

   关于中值滤波可能两者滤波的短平快算法,能够在本身博客中找到大批量的相关消息。

   
 2、计算图片 5,并动用和何学士杂文中类似的法门测算全局大气光值A。

   
 3、计算图片 6,即对M(x)实行中值滤波。

 
 上述都以用中值滤波做的效劳,在部分图像对应大气光幕图上得以见到,图像的边缘处有部分小圆弧,这一个都是矩形半径中值滤波的令人惊讶划痕,而依照双方滤波的自我也进行过,并从未像参考诗歌2说的那么有微微革新,感觉相互相互,而且有个别图还会油不过生突变,由此小编觉着写那几个散文纯粹是为着发随想。 

   
 借使是使用双边滤波算子,则步骤3和4中的median运算符需修改为bilaterfilter,别的的步骤一样。

   
 在参考故事集一种单幅图像去雾方法中是因当中值滤波的章程来去雾的,而舆论基于双方滤波的实时图像去雾技术琢磨选拔了二者滤波,如若您要促成代码,或者要求两篇杂文结合起来看,因为在散文第11中学的描述没有讲精晓什么通过取得的雾浓度数据来收获无雾的图像。

   
 由于算法的终极一步的公式难题,在有个别参数意况下图像会合世黑快或然白块,方今该难点远非解决。
有趣味对改算法举办进一步测试的同学可协调查讨论究下。

  实际上很久在此以前,当作者第1接触图像去雾技术时,开端完成的是依据中值滤波的图像去雾,并且也有肯定的功效,在本身的Imageshop的融会软件中的去雾方案便是那个的落实,不过这一个效果没有本文好。

一、前言  

 
 在大气光幕的公式中,大家看到有大局大气光A的影响,可是上述总计F(X)的进度确没有关联到A,分外无语啊。

四 、代码完结细节

   
 在程序的耗费时间上,主要还是一次中值处理上,借助于C++的有的优化(比如内嵌SSE代码,C#做不到)中值的速度也一定快了,我用1024*768的灰度图测试耗费时间约为60ms(未考虑用八线程,因为那些程序用三十二线程编码上会复杂不少),对彩色图用这种艺术去雾,I3CPU上1024*768的总耗费时间约为140ms,想要实时,换换I7的CPU试试吧(有趣的事中本身的那篇实时去雾的稿子的算法在I3上20ms,I7上有测试注解只要3到4ms)。

 图片 7  图片 8  图片 9

 

     图片 10

   
 简单的来说,算法的流水生产线可讲述如下:

     算法的最基础的法则依旧依据大气散射模型的,即:

     相关测试代码下载:

   
  http://files.cnblogs.com/Imageshop/HazeRemovalBasedOnMedianBlur.rar

   
 4、计算图片 11,注意式子中的相对值。

二 、算法的流程

           原图                          
   去雾图                          
 对应的豁达光幕

  算法的原理小编讲不清,反正看的愈多越迷糊了。

   
 而据他们说双方滤波的方案,也是很已经耳闻过,前不久有情侣传给小编一篇国内的两边滤波去雾的舆论,总体思路和依据中值的类似,想想干脆把那八个位于一起做个相比呢。

 图片 12  图片 13  图片 14

 图片 15

 
 那里的大方光幕和何凯明的舆论中的透射率图不是同二个定义,因而不负有可比性。

*********************************小编:
laviewpbt   时间: 二〇一二.12.5   联系QQ:  33184777
 转发请保留本行音讯*************************

 图片 16  图片 17  图片 18

 图片 19  图片 20  图片 21

   
 陆 、通过式子图片 22获得去雾后的图像。

   
 5、计算图片 23,式中P为控制去雾程度的因子,取值范围[0,1]。

  已知条件正是输入图像I(X),求J(x);

 图片 24  图片 25  图片 26

   
 在代码完毕上,个人感觉没有什么样难点,先求暗通道,然后就是几当中值滤波只怕是两者滤波,求全局大气光的进程还涉及到微小值滤波,首要的代码如下:

void _stdcall HazeRemovalBasedOnMedianBlur(unsigned char * Scan0, int Width,int Height,int Stride,int DarkRadius,int MedianRadius,int P)
{
    int  X, Y, Diff,Min,F;
    unsigned char* Pointer, *DarkP, *FilterP,* FilterPC;
    unsigned char * DarkChannel = (unsigned char*)malloc(Width * Height);
    unsigned char * Filter = (unsigned char*)malloc(Width * Height);
    unsigned char * FilterClone = (unsigned char*)malloc(Width * Height);

    for (Y = 0; Y < Height; Y++)
    {
        Pointer = Scan0 + Y * Stride;
        DarkP = DarkChannel + Y * Width;             // 由实际图像计算得到的图像暗通道     
        for (X = 0; X < Width; X++)
        {
            Min = *Pointer;
            if (Min > *(Pointer + 1)) Min = *(Pointer + 1);
            if (Min > *(Pointer + 2)) Min = *(Pointer + 2);
            *DarkP = (unsigned char)Min;
            DarkP++;
            Pointer += 3;
        }
    }
    memcpy(Filter, DarkChannel, Width * Height);                        // 求全局大气光A时会破坏DarkChannel中的数据

    MinValue(DarkChannel, Width, Height,Width,DarkRadius);                // 求取暗通道值

    // 利用暗通道来估算全局大气光值A
    int Sum, Value,Threshold = 0;
    int SumR = 0, SumG = 0, SumB = 0, AtomR, AtomB, AtomG, Amount = 0;
    int* Histgram = (int*)calloc(256 , sizeof(int));    
    for (Y = 0; Y < Width * Height; Y++) Histgram[DarkChannel[Y]]++;
    for (Y = 255, Sum = 0; Y >= 0; Y--)
    {
        Sum += Histgram[Y];
        if (Sum > Height * Width * 0.01)
        {
            Threshold = Y;                                        // 选取暗通道值中前1%最亮的像素区域为候选点
            break;
        }
    }
    AtomB = 0; AtomG = 0; AtomR = 0;
    for (Y = 0, DarkP = DarkChannel; Y < Height; Y++)
    {
        Pointer = Scan0 + Y * Stride;
        for (X = 0; X < Width; X++)
        {
            if (*DarkP >= Threshold)                            //    在原图中选择满足候选点的位置的像素作为计算全局大气光A的信息                        
            {
                SumB += *Pointer;
                SumG += *(Pointer + 1);
                SumR += *(Pointer + 2);
                Amount++;
            }
            Pointer += 3;
            DarkP++;
        }
    }
    AtomB = SumB / Amount;
    AtomG = SumG / Amount;
    AtomR = SumR / Amount;

    memcpy(DarkChannel,Filter, Width * Height);                        // 恢复DarkChannel中的数据
    MedianBlur(Filter,Width,Height,Width,MedianRadius,50);          // 步骤1:使用中值滤波平滑,这样处理的重要性是在平滑的同时保留了图像中的边界部分,但是实际这里用中值滤波和用高斯滤波效果感觉差不多
    memcpy(FilterClone, Filter, Width * Height);

    DarkP = DarkChannel;
    FilterP = Filter;
    for (Y = 0; Y < Height * Width; Y++)              //利用一重循环来计算提高速度
    {
        Diff = *DarkP - *FilterP;                    //通过对|DarkP -FilterP |执行中值滤波来估计的局部标准差,这样可以保证标准差估计的鲁棒性
        if (Diff < 0) Diff = -Diff;
        *FilterP = (unsigned char)Diff;
        DarkP++;
        FilterP++;
    }
    MedianBlur(Filter,Width,Height,Width,MedianRadius,50);

    FilterPC = FilterClone;
    FilterP = Filter;
    for (Y = 0; Y < Height * Width; Y++)
    {
        Diff = *FilterPC - *FilterP;                    // 步骤2:然后考虑到有较好对比度的纹理区域可能没有雾, 这部分区域就不需要做去雾处理
        if (Diff < 0) Diff = 0;                            // 这里可以这样做是因为在最后有个max(....,0)的过程,
        *FilterP = (unsigned char)Diff;
        FilterPC++;
        FilterP++;
    }

    DarkP = DarkChannel;
    FilterP = Filter;

    for (Y = 0; Y < Height * Width; Y++)
    {
        Min = *FilterP * P / 100;
        if (*DarkP > Min) 
            *FilterP = Min;                                // 获得满足约束条件的大气光幕
        else
            *FilterP = *DarkP;
        DarkP++;
        FilterP++;
    }

    FilterP = Filter;
    for (Y = 0;Y < Height; Y++)
    {
        Pointer = Scan0 + Y * Stride;
        for (X = 0; X < Width; X++)
        {
            F = *FilterP++;
            if (AtomB != F) 
                Value = AtomB *(*Pointer - F) /( AtomB - F);
            else
                Value=*Pointer;
            *Pointer++ = Clamp(Value);
            if (AtomG != F) 
                Value =  AtomG * (*Pointer - F) /( AtomG-F);
            else
                Value =  *Pointer;
            *Pointer++ = Clamp(Value);
            if (AtomR != F) 
                Value =  AtomR *(*Pointer - F) /( AtomR-F);
            else
                Value =  *Pointer;
            *Pointer++ = Clamp(Value);
        }
    }
    free(Histgram);
    free(Filter);
    free(DarkChannel);
    free(FilterClone);
}

   
 上边的许多算式是从差别散文里截图的,由此表明上稍加前后不均等,但不影响高手精晓其意义。

     
算法的效应仍然有点意外,某个图获得了一定不错的意义。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图