2012年11月13日 星期二

空间滤波器_作业心得


影像处理作业心得:空间滤波器

1. 程序界面设计

l  应用程序的功能有:
l  打开图片
l  添加胡椒盐杂讯
l  平滑滤波器处理
l  中值滤波器处理
l  锐化滤波器处理
l  保存效果图
l  重做功能。
其中,打开图片选择于菜单栏中;剩下6个功能置于图片旁边的按钮中。(见图示)

2. 胡椒盐杂讯

2.1              实现

使用滤波器前先为图片增加一定程度的杂讯,这里为胡椒盐杂讯。胡椒盐杂讯的呈现是在整张图片中任意散布着黑白点。
具体做法是在整张图片的height*width个像素点中做随机算法,决定其中哪些点要撒黑白点(也就是直接将像素值改为黑或白)。
特点:通常具有较高的频率,与周围的像素显得格格不入,十分容易分辨。(所以也叫脉冲杂讯)
随机算法
l  原算法:
由于图片的像素点实际可以用坐标值(x,y)表示,于是一开始想要做随机数,比如预设N个点撒胡椒盐,则随机产生N个坐标值并将这些坐标值对应像素值改为黑或白。算法描述简单,但实际操作需要做到去重,也就是避免相同坐标值的出现,而去重则显得工作量比较大,实现比较繁琐。
l  简单算法:
要避免原来去重的工作,则可以扫描图片的每个像素点,对于每个点做一定概率的随机决定,决定是否撒胡椒盐,虽然复杂度不是最小的,但是实现确实简单的。这里主要做图片处理效果,则暂时不考虑复杂度的优化。
eg.每次每个点产生(0~100)的随机数,当于0-5之间则撒白点,6-10之间则撒黑点,则此处胡椒盐的几率是百分之十左右。

2.2              效果图展示

l  原图:

l  胡椒盐处理:

3. 平滑滤波器

3.1              实现

作用:平滑滤波器(也叫均值滤波器),主要用于模糊化和减少杂讯。
算法:将每一个像素点的所有临近的值相加取平均值,取代改点的值。
特点:将像素之间的变化拉小。  

  中间点像素值new = 1/9 *[     ] 
过程:比较简单,做一次简单数学运算重新赋值则可,无碰到困难,注意边
      界点。

3.2              效果图展示

1)去杂讯效果

l  原杂讯图:

l  平滑处理(去除杂讯):
l  分析:
可见对于大量高频杂讯的去除,平滑滤波器的处理效果无法体现出来,只是将原来的杂讯模糊化且有变大的趋势。应该适用于小量杂讯,使用模糊降低影响。

2)模糊化效果

l  模糊处理:

l  原图:


l  分析:
经过平滑算法之后,图像锐度降低,降低到一定程度,将图像中的部分细节处理掉了,就变成了模糊。图中前后对比最明显的是眼睛发亮的部分,由于做了平滑处理,使得小猫的眼神不那么有神,同时看得到小猫头上的毛发也没有原图那么棱角分明。
               

4. 中值滤波器

4.1              实现

作用:对图像做平滑处理,对随机杂讯、脉冲杂讯等提供了较好的杂讯降低效能(将突来的高频杂讯去除)
算法:中值滤波器(排序滤波器),是对附近一定范围内(如3*3)的像素值进行排序,找出中间值代替原来的像素值。
过程:实现过程与平滑滤波器差不多,也是对九个数值做运算然后代替原值,此处多了一个步骤,就是“排序”,(先将原九个数值放到数组中),因此自定义了一个函数  int getMid(int* array),对于输入的数组,返回一个中间值。这里都是针对3*3的矩阵,因此没有真正使用实际排序算法,函数内声明一个结果数组,每次从原数组中获得当时最大值,放到结果数组对应位置,同时在原数组中将原值修改为0,而只需重复五次则可获得中值。
         for(int i = 0 ; i < 5; i ++)
         {
            max = array[i];
            mark = i;
            for(int j = 0 ; j < 5; j ++)
            {
                     if(array[j] > max)
                     {
                             mark = j;
                             max = array[j];
                     }
            }
            result[i] = max;
            array[mark] = 0;
         }

4.2              效果图展示

l  原图:

l  中值滤波器处理:

l  原图:
l  中值滤波器处理:
l  分析:
可以由两张图的处理看出,图像并没有被模糊化,而大大地降低了图像中的突变杂讯,尽量地恢复了原图,而特别的地方在于,杂讯去除的残留会体现在边缘处(尤其花图明显),边缘会有锯齿。

5. 锐化滤波器

5.1              实现

作用:主要用于突显图像强度上的变迁或强化边界线。
算法:使用拉普拉斯算法先获得拉普拉斯变化图,再将拉普拉斯图像与原始图像叠
      加而产生锐化图像。而作业中的选择的拉普拉斯模板为
-1
-1
-1
-1
8
-1
-1
-1
-1
          再加上原图,则可得模板变为
-1
-1
-1
-1
9
-1
-1
-1
-1
        可见,如果一片暗区出现了一个亮点,则锐化的处理就是将亮点变得更亮,增加了图片的噪声。
     最终结果是在保留图像背景的前提下,突现出图像中小的细节信息。
实现: 在实现过程中出现比较多的问题,主要是结果像素值的运算以及结果处理出
      错。产生结果时有时候不确定是否为所要的结果,就专门到photoshop中试
       一下同样的处理对比效果准确性。
l  错误图1
分析:
产生的原因为,溢出处理时处理语句写错,不小心将负值的变为0,导致在像素点上凸显了其他通道的色彩。当时在这张图上犹豫了挺久的,不知道是不是对的,细看有的地方确实是锐化了,可是不应该出现大块大块的色块,因此咨询了老师意见后找得出错源。(谨记:运算后如果出现了大于255或者小于0的点,称为溢出,对于溢出的处理时截断,大于255的等于255,小于0的取绝对值)
l  错误图2
分析:
产生的原因为,直接用了分析出的拉普拉斯结果值而未加上原图,也就是原来的,同时溢出处理也直接对拉普拉斯结果处理了!
1
1
1
1
-8
1
1
1
1

l  其他错误图:
以上不正确的处理效果图都是由溢出处理没做好以及拉普拉斯计算错误导致的。

5.2              效果图展示

l  原图:
l  锐化效果图:
分析:
从处理结果看出,小猫的边界线被强化了,同时背景处细微部分以及模糊的细节被加强了(加强了强度在不连续位置处的对比度)。

6. 总结

由于有了第一次作业的基础,对builderproject环境熟悉很多,这次作业完成比较快,碰到的问题大多也能很快找出并改正,而最后的锐化因为不确定效果图而咨询了老师的意见,也能够找的错误原因并得出想要效果,写出一个程序重点不在能不能写出,在出现问题能不能快速找到问题并且改正。这次作业也十分有趣,每次处理完后点击重做按钮可以观察瞬间图片的变化,看得出具体有哪些差别显著,再者,由于事件处理程序的算法出现小小错误,效果图就来了个天壤之别,而且还蛮特别的,特别是那张“发光的花”。以前直接用photoshop对图像做的一些处理,其实弄懂原理之后自己也可以写出来,很多使用的软件功能其实没有很高深很遥远,多多学习总能学会的。:)

沒有留言:

張貼留言