- Boxfilter
假如圖像中存在I(x, y)這樣一個像素點,那么 I(x-r, y-r),I(x, y+r), I(x-r, y), I(x+r, y)這樣四個點構成了一個矩形區域,該區域的像素值之和存儲在矩陣G(x, y) 位置。可以用下面的代碼來表示上述過程
G(x, y)=sum(sum(I(x-r:x+r,y-r:y+r)));
這樣的濾波器就叫做Boxfilter,它在求解方差、Haar濾波、引導濾波器中都有使用到。今天,我將分析幾種在Matlab中實現Boxfilter的方法。
- 方法一,X,Y方向分別累加求和
%利用X方向和Y方向的累加來完成
function imDst = boxfilter(imSrc,w,h)
[hei, wid] = size(imSrc);
imDst = zeros(size(imSrc));
%w,h分別為盒子濾波器的盒子半徑
% w must <= (wid-1)/2
% h must <= (hei-1)/2
%Y軸方向的累加
imCum = cumsum(imSrc, 1);
%首先考慮首部的H個像素
imDst(1:h+1, :) = imCum(1+h:2*h+1, :);
%中間像素
imDst(h+2:hei-h, :) = imCum(2*h+2:hei, :) - imCum(1:hei-2*h-1, :);
%尾部h個像素
imDst(hei-h+1:hei, :) = repmat(imCum(hei, :), [h, 1]) - imCum(hei-2*h:hei-h-1, :);
%X軸方向的累加
imCum = cumsum(imDst, 2);
%首先考慮首部的X個像素
imDst(:, 1:w+1) = imCum(:, 1+w:2*w+1);
%考慮中間像素
imDst(:, w+2:wid-w) = imCum(:, 2*w+2:wid) - imCum(:, 1:wid-2*w-1);
%考慮尾部w個像素
imDst(:, wid-w+1:wid) = repmat(imCum(:, wid), [1, w]) - imCum(:, wid-2*w:wid-w-1);
end
- 方法二,利用積分圖像
function [ imDst ] = boxfilter_opt2(imSrc,w,h )
%BOXFILTER_OPT2 Summary of this function goes here
% w,h為盒子濾波器的半徑
% 首先得到積分圖像
intImg = integralImage(imSrc);
% 去掉零首行和零首列
intImg = intImg(2:end,2:end);
dim = size(imSrc);
pad_intImg = padarray(intImg,[w+1,h+1],'replicate');
A_intImg = pad_intImg(1:dim(1),1:dim(2));
B_intImg = pad_intImg(1:dim(1),end-dim(2)+1:end);
C_intImg = pad_intImg(end-dim(1)+1:end,end-dim(2)+1:end);
D_intImg = pad_intImg(end-dim(1)+1:end,1:dim(2));
imDst = A_intImg + C_intImg - B_intImg - D_intImg;
end
第一個方法的Matlab運行時間為:0.032s,第二個方法的運行時間為:0.065s。