功能:在给定的滑动窗口大小下,对每个窗口内的像素值进行快速相加求和。
应用:图像的局部矩形内像素的和、平方和、均值、方差等特征也可以用类似Haar特征的计算方法来计算
Haar特征是一种用于物体识别的数字图像特征,特别是在人脸检测领域中得到了广泛应用。
Haar特征得名于其与原始的Haar小波变换在计算方式上的相似性。这种特征通过计算图像中相邻矩形区域的像素强度差来捕捉图像的某些特性,如边缘、线条和中心等区域的变化。主要特点包括:
综上所述,Haar特征是计算机视觉中的一个强大工具,它在物体识别特别是人脸检测方面展现出了显著的性能和效率。
盒子滤波优点:使复杂度为O(MN)的求和,求方差等运算降低到O(1)或近似于O(1)的复杂度。
盒子滤波缺点:不支持多尺度。
原理:首先建立一个数组A,宽高与原图像相等,然后对这个数组赋值,每个元素的值A[i]赋为该点与图像原点所构成的矩形中所有像素的和。初始化之后,想要计算某个矩形像素和的时候可以采用如下:D矩形的像素和就等于A[4] – A[2] – A[3] + A[1],共4次运算,即O(4)。
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], 需要加上一个新进来的像素,再减去一个出去的像素,然后便开始新的一行的计算了。
function imDst = boxfilter(imSrc, r)
%------------------------------------------------------------------------------
[hei, wid] = size(imSrc);
imDst = zeros(size(imSrc));
%对每行进行累积求和
imCum = cumsum(imSrc, 1);
imDst(1:r+1, :) = imCum(1+r:2*r+1, :);
%imDst的接下来的行,从imCum的第2*r+2行到第hei行减去imCum的从第1行到第hei-2*r-1行
imDst(r+2:hei-r, :) = imCum(2*r+2:hei, :) - imCum(1:hei-2*r-1, :);
%umDst的最后r行,使用imCum的第hei行按列重复r次,减去imCum的从第hei-2*r到第hie-r-1行
imDst(hei-r+1:hei, :) = repmat(imCum(hei, :), [r, 1]) - imCum(hei-2*r:hei-r-1, :);
%对imDst的每一行进行累积求和
imCum = cumsum(imDst, 2);
%imDst的列,从imCum的第r+2列到2*r+1列按行求和
imDst(:, 1:r+1) = imCum(:, 1+r:2*r+1);
%imDst接下来的列,从inCum的第2*r+2列到第wid列,减去imCum的从第1列到第wid-2*r-1列
imDst(:, r+2:wid-r) = imCum(:, 2*r+2:wid) - imCum(:, 1:wid-2*r-1);
%imDst的最后r列,使用imCum的第wid列按行重复r次,减去imCum的从第wid-2*r列到第wid-r-1列
imDst(:, wid-r+1:wid) = repmat(imCum(:, wid), [1, r]) - imCum(:, wid-2*r:wid-r-1);
end