2012年11月14日 星期三

HW03 空間濾波器實作

平滑化:
原圖

平滑化處理

        平滑化的目的是為了使圖片看起來不會那麼生硬,也可以說是將影像反鋸齒化或模糊化,使影像的雜訊減少。做法就是: 將每個Pixel周圍3x3區域的色彩值加總後平均,取代原來Pixel的色彩值,即可得到平滑化的效果。


銳化:
原圖

銳化處理

        銳化其實就是平滑化的相反,目的是增強圖片的細節和輪廓,凸顯影像邊緣的效果,使影像變得清晰。做法就是: 將每個Pixel的色彩值乘5倍後減去其上下左右Pixel的色彩值,取代原來Pixel的色彩值,即可得到銳化的效果。

銳化處理(出錯!!)

        上圖是在寫程式時出現的問題,我反覆檢查了好幾次程式碼,銳化的概念並沒有做錯,最後才發現是自己程式碼寫法有些問題。我按照座標讀取圖片Pixel色彩值,計算後就直接存回去原來的Pixel,所以後面讀取的Pixel色彩值是前面修改過的值,導致圖片看起來如上圖的樣貌。     


中值濾波器:
原圖

加入胡椒鹽雜訊

中值濾波器處理

        中值濾波器的目的是為了將雜訊降低,胡椒鹽雜訊用這個方式處理效果相當明顯,他將大部分的胡椒鹽雜訊消除,但是還是會有少數殘留的雜訊。做法就是: 每個Pixel周圍3x3區域的色彩值找出中位數取代原來Pixel的色彩值,即可得到中值濾波的效果。

心得:
        這次作業也是使用C#寫的,因為第一次作業花了相當多的時間去了解圖像會使用到的指令,所以這次作業只要了解空間濾波器每個應用的原理,撰寫程式時相當上手。另外再選圖像時發現有些圖像在做處理後較不明顯,必須找到合適的圖片才能凸顯其效果,像選擇做平滑化的圖片必須要選擇輪廓較清晰的,處理後的效果才會比較明顯。我覺得這次作業還滿有趣的,之前處理圖片都是用人家寫好的程式做處理,卻不知處理的原理,透過這次作業不但做出程式也理解了處理的方式,感覺很有成就感!

96360210 黃彥羲 HW2


因為filtering必須要用到前一行的ScanLine,所以用另一個image來儲存,來避免計算時用到已修改的數值。但是當想對同一張圖多次Smooth時,必須Smooth->儲存->讀取->Smooth....重複動作,相當得很麻煩。若把計算結果暫存到一個陣列,等全圖都計算完畢後,一次更改記憶體內容,就可以解決這個問題,但是相對的處理速度會比較慢。以下為課本上的1/9算法。


原圖


Smooth 1次

Smooth 第2~10次
 事實上第2~10次的結果肉眼看不出差別,但卻比第一次更平滑。

在知道銳化公式後,Laplacian的算法根本就是把Smooth的各項更改係數而已(這裡計算8方向)。再把bPtrImage2[j*3+k] = bPtrImage[j*3+k]+c*iLaplacian。

只是當計算的該點與其周圍八點落差嚴重時,Laplacian會變的很大,很容易超過0~255,會變得像下圖所示。根據常數c=1或-1,圖會有些不同。


銳化 c=1


銳化 c=-1
因此需要將超出範圍的設為極值,圖片才會變得正常。

c=1

c=-1


中值濾波器比前兩個稍微麻煩點。因為只要中值,所以就不排序,直接找5次最大值。
前面連續4次,每次找到最大值就改為0,即下一次該值不會再是最大值,而第5次的最大值就是中值。



一次胡椒

一次胡椒過濾

二次胡椒

二次胡椒過濾
可以看的出來,因為是中值過濾的關係,當胡椒越密集時,越難清除乾淨。


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对图像做的一些处理,其实弄懂原理之后自己也可以写出来,很多使用的软件功能其实没有很高深很遥远,多多学习总能学会的。:)