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。