盒子滤波(BOX FILTER)方框滤波学习笔记

功能:在给定的滑动窗口大小下,对每个窗口内的像素值进行快速相加求和。

应用:图像的局部矩形内像素的和、平方和、均值、方差等特征也可以用类似Haar特征的计算方法来计算

Haar特征是一种用于物体识别的数字图像特征,特别是在人脸检测领域中得到了广泛应用。

Haar特征得名于其与原始的Haar小波变换在计算方式上的相似性。这种特征通过计算图像中相邻矩形区域的像素强度差来捕捉图像的某些特性,如边缘、线条和中心等区域的变化。主要特点包括:

  1. 基于相邻矩形的特征:Haar特征涉及在图像的特定位置放置多个大小和形状不同的矩形,然后从这些矩形覆盖的像素中计算出相应的值,通常是像素强度的总和或平均值。计算得到的值会进行比较,以形成特征向量。
  2. 分类:Haar特征可以分为几类,主要包括边缘特征、线性特征、中心特征和对角线特征等类型。每种类型的特征都设计用来捕捉图像中不同方向和类型的纹理信息。
  3. 级联分类器:为了提高检测的准确性和速度,通常会使用AdaBoost算法训练多个Haar特征,并将它们组织成级联分类器。这种方法逐步增加检测复杂性,能够有效地区分对象和非对象区域。
  4. 积分图:为了快速计算大量特征,Viola和Jones引入了积分图的概念。积分图是一种能够高效计算图像区域像素和的数据结构,它允许在常量时间内计算任意位置的任意大小矩形区域的像素和,从而加速了Haar特征的计算过程。
  5. 应用:Haar特征因其简单性和计算效率而被广泛应用于实时物体检测系统,尤其是人脸检测。它们也被用于其他物体的检测任务,如车辆、行人等。
  6. 实现:OpenCV是一个流行的计算机视觉库,它提供了用于计算Haar特征和构建级联分类器的函数和方法。这大大简化了开发者在应用程序中实现物体检测的过程。

综上所述,Haar特征是计算机视觉中的一个强大工具,它在物体识别特别是人脸检测方面展现出了显著的性能和效率。

盒子滤波优点:使复杂度为O(MN)的求和,求方差等运算降低到O(1)或近似于O(1)的复杂度。

盒子滤波缺点:不支持多尺度。

盒子滤波(BOX FILTER)方框滤波学习笔记_第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

你可能感兴趣的:(学习,笔记,matlab,数据结构)