在描述Viola-Jones对象检测框架的论文中(Viola和Jones的实时人脸检测),提到如下内容:
用于训练的所有示例子窗口都进行了方差归一化,以尽量减少不同光照条件的影响。
我的问题是“如何在Octave中实现图像归一化?”
我并不是在寻找Viola & Jones使用的具体实现方法,而是寻找一个能产生几乎相同输出的类似方法。我已经跟随了很多haar训练教程(试图检测手部),但尚未能输出一个好的检测器(xml)。
我尝试联系了作者,但至今仍未得到回应。
回答:
我已经在这个线程中回答了如何进行一般指导下的操作。
以下是如何在Octave中进行方法1(标准化到标准偏差)的操作(以一个随机矩阵A
为例,当然可以应用于任何矩阵,这是图像的表示方式):
>>A = rand(5,5)A = 0.078558 0.856690 0.077673 0.038482 0.125593 0.272183 0.091885 0.495691 0.313981 0.198931 0.287203 0.779104 0.301254 0.118286 0.252514 0.508187 0.893055 0.797877 0.668184 0.402121 0.319055 0.245784 0.324384 0.519099 0.352954>>s = std(A(:))s = 0.25628>>u = mean(A(:))u = 0.37275>>A_norn = (A - u) / sA_norn = -1.147939 1.888350 -1.151395 -1.304320 -0.964411 -0.392411 -1.095939 0.479722 -0.229316 -0.678241 -0.333804 1.585607 -0.278976 -0.992922 -0.469159 0.528481 2.030247 1.658861 1.152795 0.114610 -0.209517 -0.495419 -0.188723 0.571062 -0.077241
在上述操作中,您使用了以下步骤:
- 获取矩阵的标准偏差:
s = std(A(:))
- 获取矩阵的平均值:
u = mean(A(:))
- 然后按照公式
A'[i][j] = (A[i][j] - u)/s
进行向量化操作:A_norm = (A - u) / s
使用向量归一化进行归一化也很简单:
>>abs = sqrt((A(:))' * (A(:)))abs = 2.2472>>A_norm = A / absA_norm = 0.034959 0.381229 0.034565 0.017124 0.055889 0.121122 0.040889 0.220583 0.139722 0.088525 0.127806 0.346703 0.134059 0.052637 0.112369 0.226144 0.397411 0.355057 0.297343 0.178945 0.141980 0.109375 0.144351 0.231000 0.157065
在上述操作中:
abs
是向量的绝对值(其长度),通过向量化乘法计算得出(A(:)' * A(:)
实际上是sum(A[i][j]^2)
)- 然后我们使用它来归一化向量,使其长度为1。