.
..
快速中值濾波及c語言實現
學生姓名: 劉 勇 學 號: 6100410218 專業班級: 數媒101
【摘要】本文討論了用c語言在微機上實現中值濾波及快速算法,在程序設計的過程中充分考慮到程序運行的時間復雜度和空間復雜度的問題.解決了由于圖像太大而內存不夠的問題,運用對程序運行時的方法,得出在PENTIUM-S100MHz上中值濾渡的一般算法運行4.23秒.而快速算法運行2 58秒。
【關鍵詞】c語言;中值濾波;快速算法
1 引言
中值濾波是涂基發明的一種非線性信號處理技術,對抑制圖像的噪聲非常有效,在二維形式下,中值濾渡器是一個古有奇數個像素的滑動窗口,窗口正中的象素的灰度值用窗口內各個象素的中值代替窗口的中值為窗口中象素按大小順序排列后處于中間位置的象素;本文討論中值濾的一般算法并比較其運算速度。
2 用C語言實現算法的若干問題
在設計算法編制程序的時候,我們充分考慮到程序運行的時間復雜度和空間復雜度問題,在解決問
題的前提下,使算法盡量簡單,使程序運行占有的空間盡量的小,這樣來減少不必要的時問浪費和空間浪費,從而太大的提高程序執行的效率。
首先考慮到的內存問題。由于在本文算法中用的圖像是512+512 8bit,這就存在一個內存不夠大一整幅圖像不能一次性調入的問題。為了解受此問題,可以只開辟一個3"512的緩沖區n,將原圖像采用分批調入緩沖區,使內存不夠的問題得到了圓滿的解決。
另外為了對中值濾波的快速算法和普通算法進行精確的比較,采用對程序運行計時的方法,并精確計算每個算法運行的時間,使得出的結論更可靠。
3 中值濾波算法的C語言程序實現
本算法采用對開辟的3*512的緩沖區從左到右依次形成一個3*3的窗口.然后將此3*3的窗口放
人一個一維數組中,調用求中值子函數.通過排序得出中值,當此中值不等于窗口中間位置的象素時.用此中值來代替窗VI中間位置的象素灰度值.若此緩沖區處理完畢后,將緩沖區的第一行存入新建的文件中,將第二、第三行分別向上移動一行,若存人新建的文件中的行數小于或等于511(即這樣處理的行
數小于或等于511),則從原文件中調入一行作為緩沖區第三行,按上述方法進行直到處理的總行數等于511為止,最后,將緩沖區的第二、三行存人新建的文件,程序流程框圖如圖1
4 中值濾波快速算法的C語言程序實現
本算法充分利用了上一次處理的結果.采用迭代,逐次逼近的方法得到本次的中值,在一行處理完畢后轉人下一行也采用走S型的方法.這樣除第一個窗口采用了一伏排序得到中值外,其它的窗口都利
用上伏的窗口的象素刪除無用的3個象素后再加人新的3個象素,利用迭代的方法得到本次窗口的中值.這樣太大地提高了程序執行的效率。
4.1算法的解釋
首先是開辟一個3*512的緩沖區a,在初始化緩沖區時考慮到時間復雜度的問題,所以只初始化了第二、三行,而對第一行只初始化了前三個象素,這樣便在緩沖區中可以得到一個3*3的窗口,對此窗口進行排序求中值后得出第一個窗口的中間象素的值.將文件指針定位在2*512處。然后開始循環,當處理的行數小于或等于511時,將緩沖區a中的第二、三行分別向上移動一行變為第一、二行,從文件中讀人512個字節作為緩沖區的第三行,并用行數模2的方法設置方向標志k.當k為0時,從左向右移動窗口.當k為1時.從右向左移動窗口.而每一窗口都利用上次的窗口的像素刪除無用的3個象素后再加入新的3個象素.利用迭代的方法從上次的中值得到本次的中值。當處理完一行后將緩沖區的第一行存入新建的文件中,最后將緩沖區的第二、三行存入文件中。
4.2 算法代碼
// ImageProcessingDoc.cpp : implementation of the CImageProcessingDoc class
//
#include "stdafx.h"
#include "ImageProcessing.h"
#include "ImageProcessingDoc.h"
#include "GreyRatio.h"
#include
#define PI (acos(0.0) * 2)
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// CImageProcessingDoc
IMPLEMENT_DYNCREATE(CImageProcessingDoc, CD