matlab imboxfilt,BoxFilter的Matlab实现方法

本文详细介绍了在Matlab中实现Boxfilter的两种方法:一种是通过分别在X轴和Y轴方向上累加求和,另一种是利用积分图像。通过实例展示了代码实现,并给出了各自的运行时间,第一种方法的运行时间更快,为0.032s,而第二种方法的运行时间为0.065s。这两种方法在图像处理和滤波算法中有广泛应用。
摘要由CSDN通过智能技术生成

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值