天天看點

數字圖像處理:快速均值濾波數字圖像處理實驗 快速均值濾波

數字圖像處理實驗 快速均值濾波

實驗題目: 實驗5.1 快速均值濾波

實驗5.1 快速均值濾波

實驗過程中遇到和解決的問題:

指針通路

opencv圖像存儲按照一行一行存儲,通路

(row,col+t)

位置,指針要考慮channnel移動:

p1=p+channel*t

,然後使用 p1[0],p1[2],p1[1] 來讀取具體的值.

p(row)

通路行指針,計算

channelxcols

得到列指針數目,也可以周遊;

relate code

:

和内置的算法有亮暗上的差異

過程中使用uchar存儲圖像偏黑:過程中的小數取整偏小,偏黑。

數字圖像處理:快速均值濾波數字圖像處理實驗 快速均值濾波

使用double存儲:

數字圖像處理:快速均值濾波數字圖像處理實驗 快速均值濾波
濾波核大小奇數偶數大小

偶數特殊處理,修改成奇數:

//濾波核隻能為奇數,偶數轉化為奇數
	if (window_size %2 == 0) {
		cout << "MeanFilter window size must be odd but size=" << window_size << "\n";
		window_size++;
	}
           
與OpenCV的boxFilter函數比較計算速度
數字圖像處理:快速均值濾波數字圖像處理實驗 快速均值濾波

差異分析:

差異:這裡使用的是提前計算好積分圖,後面直接使用積分圖計算圖像值的時間,大概是

boxfilter

的兩倍時間

算上初始化積分圖時間:

數字圖像處理:快速均值濾波數字圖像處理實驗 快速均值濾波

原因分析:

  • 初始化不同

    Boxfilter的初始化:

    數字圖像處理:快速均值濾波數字圖像處理實驗 快速均值濾波

    1、給定一張圖像,寬高為(M,N),确定待求矩形模闆的寬高(m,n),如圖紫色矩形。圖中每個黑色方塊代表一個像素,紅色方塊是假想像素。

    2、開辟一段大小為M的數組,記為buff, 用來存儲計算過程的中間變量,用紅色方塊表示

    3、将矩形模闆(紫色)從左上角(0,0)開始,逐像素向右滑動,到達行末時,矩形移動到下一行的開頭(0,1),如此反複,每移動到一個新位置時,計算矩形内的像素和,儲存在數組A中。以(0,0)位置為例進行說明:首先将綠色矩形内的每一列像素求和,結果放在buff内(紅色方塊),再對藍色矩形内的像素求和,結果即為紫色特征矩形内的像素和,把它存放到數組A中,如此便完成了第一次求和運算。

    4、每次紫色矩形向右移動時,實際上就是求對應的藍色矩形的像素和,此時隻要把上一次的求和結果減去藍色矩形内的第一個紅色塊,再加上它右面的一個紅色塊,就是目前位置的和了,用公式表示 sum[i] = sum[i-1] - buff[x-1] + buff[x+m-1]

    5、當紫色矩形移動到行末時,需要對buff進行更新。因為整個綠色矩形下移了一個像素,是以對于每個buff[i], 需要加上一個新進來的像素,再減去一個出去的像素,然後便開始新的一行的計算了。

    Boxfilter的初始化過程非常快速,每個矩形的計算基本上隻需要一加一減兩次運算。

​ 而這裡采用了二維字首和的方法.

  • 提取矩陣特征不同:Boxfilter:1次運算;這裡:2次加法,2次減法;

結果分析與體會:

數字圖像處理:快速均值濾波數字圖像處理實驗 快速均值濾波
數字圖像處理:快速均值濾波數字圖像處理實驗 快速均值濾波
數字圖像處理:快速均值濾波數字圖像處理實驗 快速均值濾波
  • 在效果上和

    boxfilter

    基本一緻.

源碼

代碼連接配接

繼續閱讀