CodeBook算法

article/2025/11/11 6:56:50
年份论文题目作者论文内容
2004Background modeling and subtraction by codebook constructionK. Kim, T. Chalidabhongse, D. Harwood, and L. Davis提出了CodeBook算法
2005Real-time foreground–background segmentation using codebook modelK. Kim, T. Chalidabhongse, D. Harwood, and L. Davis对2004论文中的算法作了部分修改,并提出了算法的两种改进,最后利用PDR分析对CodeBook、MOG、Kernal、UNI四种建模方法进行了性能对比
2009Real Time Foreground-Background Segmentation Using a Modified Codebook ModelIlyas A , Scuturici M , Miguet S .null
2010Real-time foreground-background segmentation based on improved codebook model(暂定)Li Q , Shao C , Yue H , et al.null

2005CodeBook:

  • 提出的颜色模型: 为了解决阴影和强光的问题,提出了一种颜色模型分离色度和亮度,分别评估色度偏差和亮度偏差。在这里插入图片描述
    设观测像素 x t = ( R , G , B ) {x_t}=(R,G,B) xt=(R,G,B),码字 c i , v i = ( R ˉ i , G ˉ i , B ˉ i ) {c_i},{v_i}=({{\bar R}_i},{{\bar G}_i},{{\bar B}_i}) ci,vi=(Rˉi,Gˉi,Bˉi)
    ∣ ∣ x t ∣ ∣ 2 = R 2 + G 2 + B 2 ∣ ∣ v i ∣ ∣ 2 = R ˉ i 2 + G ˉ i 2 + B ˉ i 2 < x t , v i > 2 = ( R ˉ i R + G ˉ i G + B ˉ i B ) p 2 = ∣ ∣ x t ∣ ∣ 2 cos ⁡ 2 θ = < x t , v i > 2 ∣ ∣ v i ∣ 2 \begin{array}{l}||{x_t}|{|^2} = {R^2} + {G^2} + {B^2}\\||{v_i}|{|^2} = \bar R_i^2 + \bar G_i^2 + \bar B_i^2\\ < {x_t},{v_i}{ > ^2} = ({{\bar R}_i}R + {{\bar G}_i}G + {{\bar B}_i}B)\\{p^2} = ||{x_t}|{|^2}{\cos ^2}\theta = \frac{{ < {x_t},{v_i}{ > ^2}}}{{||{v_i}{|^2}}}\end{array} xt2=R2+G2+B2vi2=Rˉi2+Gˉi2+Bˉi2<xt,vi>2=(RˉiR+GˉiG+BˉiB)p2=xt2cos2θ=vi2<xt,vi>2色度偏差亮度偏差按下式计算:
    { c o l o r d i s t ( x t , v i ) = δ = ∣ ∣ x t ∣ ∣ 2 − p 2 b r i g h t n e s s ( I , < I ˇ , I ^ > ) = { t r u e : i f I l o w ≤ ∣ ∣ x t ∣ ∣ ≤ I h i f a l s e : o t h e r w i s e \left\{ \begin{array}{l}colordist({x_t},{v_i}) = \delta = \sqrt {||{x_t}|{|^2} - {p^2}} \\brightness(I, < \check I,\hat I > ) = \left\{ \begin{array}{l}true:if\mathop {}\limits^{} {I_{low}} \le ||{x_t}|| \le {I_{hi}}\\false:otherwise\end{array} \right.\end{array} \right. colordist(xt,vi)=δ=xt2p2 brightness(I,<Iˇ,I^>)={true:ifIlowxtIhifalse:otherwise I l o w = α I ^ , I h i = min ⁡ { β I ^ , I ˇ α } , α < 1 , β > 1 {I_{low}} = \alpha \hat I,{I_{hi}} = \min \{ \beta \hat I,\frac{\check I}{\alpha }\} ,\alpha < 1,\beta > 1 Ilow=αI^,Ihi=min{βI^,αIˇ},α<1,β>1
    通常 α \alpha α为0.4~0.7, β \beta β为1.1~1.5
    注:
    色度偏差实质上就是 x t {x_t} xt O v i Ov_i Ovi直线的距离

  • 算法思路: CodeBook算法使用量化/聚类方法来构建背景模型,一个像素点有一个码本来代表该点的背景模型,码本大小根据样本变化情况而改变,一个码本可能包含一个/多个码字。在训练期间构建出每个像素点的码本,在后续分类中将当前像素和码本中的多个码字进行比较,根据色度偏差和亮度偏差来进行分类。

χ = { x 1 , x 2 , . . . , x N } \chi = \{ {x_1},{x_2},...,{x_N}\} χ={x1,x2,...,xN}表示单个像素由N个RGB向量构成的训练序列。
ℓ = { c 1 , c 2 , . . . , c L } \ell = \{{c_1},{c_2},...,{c_L}\} ={c1,c2,...,cL}表示单个像素由L个码字构成的码本。
每个码字 c i , i = 1... L c_i,i=1...L ci,i=1...L 由一个RGB向量 v i = ( R ˉ i , G ˉ i , B ˉ i ) {v_i} = ({\bar R_i},{\bar G_i},{\bar B_i}) vi=(Rˉi,Gˉi,Bˉi)和一个6元组 a u x i = < I ˇ i , I ^ i , f i , λ i , p i , q i > au{x_i} = <{\check I_i}, {\hat I_i},{f_i},{\lambda _i},{p_i},{q_i} > auxi=<Iˇi,I^i,fi,λi,pi,qi>构成
I ˇ i , I ^ i {\check I_i},{\hat I_i} Iˇi,I^i:分配给此码字的最小和最大亮度
f i {f_i} fi:该码字的出现的频率(次数)
λ i {\lambda _i} λi:MNRL(maximum negative run-length)定义为训练期间该码字没有出现最长间隔
p i , q i {p_i},{q_i} pi,qi:码字第一次和最后一次出现的时间

  • 模型初始化: 使用前N帧按下述方法进行码本的构建。

  i:t 时刻观测的像素 x t = ( R , G , B ) , I = R 2 + G 2 + B 2 {x_t}=(R,G,B),I = \sqrt {{R^2} + {G^2} + {B^2}} xt=(R,G,B),I=R2+G2+B2
 ii:根据下面两个条件找到 x t {x_t} xt所匹配的码字 c m {c_m} cm ε 1 {\varepsilon _1} ε1是采样阈值(带宽) { c o l o r d i s t ( x t , v m ) ≤ ε 1 b r i g h t n e s s ( I , < I ˇ m , I ^ m > ) = t r u e \left\{\begin{array}{l}colordist({x_t},{v_m}) \le {\varepsilon _1}\\brightness(I, < {{\check I}_m},{{\hat I}_m} > ) = true\end{array} \right. {colordist(xt,vm)ε1brightness(I,<Iˇm,I^m>)=trueiii:若没有匹配的,则 L ← L + 1 L \leftarrow L + 1 LL+1,创建一个新的码字 c L {c_L} cL { v L = ( R , G , B ) a u x L = < I , I , 1 , t − 1 , t , t > \left\{ \begin{array}{l}{v_L} = (R,G,B)\\au{x_L} = < I,I,1,t - 1,t,t > \end{array} \right. {vL=(R,G,B)auxL=<I,I,1,t1,t,t>iv:若有匹配的,则更新所匹配的码字 c m {c_m} cm
      更新前: { v m = ( R ˉ m , G ˉ m , B ˉ m ) a u x m = < I ˇ m , I ^ m , f m , λ m , p m , q m > \left\{ \begin{array}{l} {v_m} = ({{\bar R}_m},{{\bar G}_m},{{\bar B}_m})\\ au{x_m} = < {{\check I}_m},{{\hat I}_m},{f_m},{\lambda _m},{p_m},{q_m} > \end{array} \right. {vm=(Rˉm,Gˉm,Bˉm)auxm=<Iˇm,I^m,fm,λm,pm,qm>      更新后: { v m = ( f m R ˉ m + R f m + 1 , f m G ˉ m + G f m + 1 , f m B ˉ m + B f m + 1 ) a u x m = < min ⁡ { I , I ˇ m } , max ⁡ { I , I ^ m } , f m + 1 , max ⁡ { λ m , t − q m } , p m , t > \left\{ \begin{array}{l} {v_m} = (\frac{{{f_m}{{\bar R}_m} + R}}{{{f_m} + 1}},\frac{{{f_m}{{\bar G}_m} + G}}{{{f_m} + 1}},\frac{{{f_m}{{\bar B}_m} + B}}{{{f_m} + 1}})\\ au{x_m} = < \min \{ I,{{\check I}_m}\} ,\max \{ I,{{\hat I}_m}\} ,{f_m} + 1,\max \{ {\lambda _m},t - {q_m}\} ,{p_m},t > \end{array} \right. {vm=(fm+1fmRˉm+R,fm+1fmGˉm+G,fm+1fmBˉm+B)auxm=<min{I,Iˇm},max{I,I^m},fm+1,max{λm,tqm},pm,t> v:循环上述4步,当第N帧处理完后,按下式修改每个码字的 λ i {\lambda _i} λi
λ i ← max ⁡ { λ i , ( N − q i + p i − 1 ) } {\lambda _i} \leftarrow \max \{ {\lambda _i},(N - {q_i} + {p_i} - 1)\} λimax{λi,(Nqi+pi1)}vi:对建模后的码本进行修正,M表示修正后的码本,按下式去掉那些长时间未出现的码字,这些码字大概率代表着前景, T M T_M TM通常设置为训练帧数的一半,即 N 2 \frac{N}{2} 2N
M = { c m ∣ c m ∈ ℓ ∧ λ m ≤ T M } M=\{ {c_m}|{c_m} \in \ell \wedge {\lambda _m} \le{T_M}\} M={cmcmλmTM}注:
1.并非找最匹配的码字,找到一个相匹配的码字后就不再继续找了。
2.训练期间可以包含前景,第vi步会去除掉表示前景的码字。

  • 前景/背景分类: 找到相匹配的码字,若有匹配的,则分类为背景,否则分类为前景。

  i:t 时刻观测的像素 x t = ( R , G , B ) , I = R 2 + G 2 + B 2 {x_t}=(R,G,B),I = \sqrt {{R^2} + {G^2} + {B^2}} xt=(R,G,B),I=R2+G2+B2
 ii:根据下面两个条件找到 x t {x_t} xt所匹配的码字 c m {c_m} cm ε 2 {\varepsilon _2} ε2是检测阈值 { c o l o r d i s t ( x t , v m ) ≤ ε 2 b r i g h t n e s s ( I , < I ˇ m , I ^ m > ) = t r u e \left\{\begin{array}{l}colordist({x_t},{v_m}) \le {\varepsilon _2}\\brightness(I, < {{\check I}_m},{{\hat I}_m} > )= true\end{array} \right. {colordist(xt,vm)ε2brightness(I,<Iˇm,I^m>)=trueiii: B G S ( x ) = { f o r e g r o u n d : n o m a t c h b a c k g r o u n d : o t h e r w i s e BGS(x) = \left\{ \begin{array}{l}foreground:no\mathop{}\limits^{}match\\background:otherwise\end{array} \right. BGS(x)={foreground:nomatchbackground:otherwise

  • 模型更新: 若有匹配的码字(分类为背景),则按照模型初始化中第iv步更新所匹配的码字。
  • 涉及参数: α \alpha α β \beta β ε 1 {\varepsilon _1} ε1 ε 2 {\varepsilon _2} ε2
  • 改进1(分层建模与检测): 只有分类为背景才能融合入背景模型中,所以当新加入/移除物体则不能融合进背景模型中。因此提出了分层建模与检测。
    定义额外的模型 H H H(缓存)和三个参数 T h T_h Th T a d d T_{add} Tadd T d e l e t e T_{delete} Tdelete

i:模型初始化后获得背景模型 M M M,创建一个新的背景模型 H H H作为缓存
ii:对于像素 x t {x_t} xt,若在 M M M中找到了匹配的码字,则更新这个码字
iii:若 M M M中没找到,则在 H H H中找,若找到了,则更新 H H H中的码字,若没找到,则创新一个新的码字 h h h并加入 H H H
iv:根据 T h T_h Th过滤缓存中的码字 H ← { h i ∣ h i ∈ H , λ i > T H } H \leftarrow \{ {h_i}|{h_i} \in H,{\lambda _i} > {T_H}\} H{hihiH,λi>TH}
v:将缓存中保存时间很长的码字移动到M中
M ← M ∪ { h i ∣ h i ∈ H , h i 存 在 的 时 间 > T a d d } M \leftarrow M \cup \{ {h_i}|{h_i} \in H,{h_i}存在的时间>T_{add}\} MM{hihiH,hi>Tadd}
vi:从M中删除长时间没有被匹配到的码字
M ← { c i ∣ c i ∈ M , c i 未 被 匹 配 的 时 间 > T d e l e t e } M \leftarrow \{ {c_i}|{c_i} \in M,{c_i}未被匹配的时间>T_{delete}\} M{ciciM,ci>Tdelete}
vii: 重复 ii~vi 步
注: M M M中有匹配的则分类为背景,没匹配则分类为前景( H H H中无论是否有匹配都分类为前景)

  • 改进2(自适应码本更新): 在全局照明变化的时候码字应该被更新。以适当的学习速率对码字向量和方差进行指数平滑可有效地应对照明变化,即构建的每个码字 c m {c_m} cm添加了一个变量 σ m {\sigma_m} σm,修改码字构建过程中的第iv步:( γ \gamma γ ρ \rho ρ是学习率)
    1. v m v_m vm的更新公式替换为: v m ← γ x t + ( 1 − γ ) v m {v_m} \leftarrow \gamma {x_t} + (1 - \gamma ){v_m} vmγxt+(1γ)vm
    2.附加 σ m 2 ← ρ δ 2 + ( 1 − ρ ) σ m 2 \sigma _m^2 \leftarrow \rho {\delta ^2} + (1 - \rho )\sigma _m^2 σm2ρδ2+(1ρ)σm2 σ m 2 \sigma _m^2 σm2是色度偏差的总方差,当算法开始时初始化 σ m \sigma _m σm
    3.色度偏差计算公式修改为: c o l o r d i s t ( x t , v i ) = δ σ i colordist({x_t},{v_i}) = \frac{\delta }{{{\sigma _i}}} colordist(xt,vi)=σiδ
    注:
    1.2004年论文中使用的是 I = R + G + B I=R+G+B I=R+G+B
    2.2004年论文在训练阶段确定模型后就不再更新模型了


http://chatgpt.dhexx.cn/article/pcSA68fu.shtml

相关文章

图像处理之前景检测(三)之码本(codebook)(主要为代码升级)

图像处理之前景检测&#xff08;三&#xff09;之码本&#xff08;codebook&#xff09; CodeBook算法的基本思想是得到每个像素的时间序列模型。这种模型能很好地处理时间起伏&#xff0c;缺点是需要消耗大量的内存。CodeBook算法为当前图像的每一个像素建立一个CodeBook(CB)结…

RIDCP: Revitalizing Real Image Dehazing via High-Quality Codebook Priors(CVPR2023)论文记录

通过高质量码本先验重塑真实图像去雾&#xff08;CVPR2023&#xff09; RIDCP: Revitalizing Real Image Dehazing via High-Quality Codebook Priors通过高质量码本先验重塑真实图像去雾&#xff08;CVPR2023&#xff09;摘要一、数据合成流程二、VQGAN 预训练&#xff1a;构建…

【AI人工智能绘画 CV】Towards Robust Blind Face Restoration with Codebook Lookup Transformer

Towards Robust Blind Face Restoration with Codebook Lookup Transformer (NeurIPS 2022) 使用 Codebook Lookup Transformer 实现稳健的盲脸修复 Blind face restoration is a highly ill-posed problem that often requires auxiliary guidance to 1) improve the mapping…

2021-11-10-Codebook理解

《Deep Visual-Semantic Quantization for Efficient Image Retrieval》中提到的codebook是什么意思&#xff1f; Specifically, each image embedding zn is quantized using a set of M codebooks C [C1, . . . , CM ], each codebook Cm contains K codewords Cm [Cm1, .…

《学习openCV》例程解析 ex_9_3(codeBook模型实现背景减除)

56帧时 63帧时 /** 比平均背景法性能更加良好的方法,codeBook模型实现背景减除 核心代码详细解析和实现 by zcube */ /************************************************************************/ /* A few more thoughts on codebook models In general, the codebook met…

“Requesting Java AST from selection“. ‘boolean com.ibm.icu.text.UTF16.isSurrogate(char)‘

记录一次问题。自从安装了spring tool&#xff08;sts&#xff09;插件后&#xff0c;在使用eclipse过程中总是弹出An internal error occurred during: "Requesting Java AST from selection". boolean com.ibm.icu.text.UTF16.isSurrogate(char)这种错误&#xff0…

详解Unicode与UTF-8、UTF-16、UTF-32.

计算机起源于美国&#xff0c;上个世纪&#xff0c;他们对英语字符与二进制位之间的关系做了统一规定&#xff0c;并制定了一套字符编码规则&#xff0c;这套编码规则被称为ASCII编码 ASCII 编码一共定义了128个字符的编码规则&#xff0c;用七位二进制表示 ( 0x00 - 0x7F ), …

解决eclipse boolean com.ibm.icu.text.UTF16.isSurrogate(char)

window > preferences > java > Editor > mark occurrences and desable : mark occurrences ...

字符集编码 Unicode UTF8 UTF16 UTF32 和BOM(Byte Order Mark)

BOM(Byte Order Mark) 在分析unicode之前,先把bom(byte order mark)说一下。 bom是unicode字符顺序的标识符号,一般以魔数(magic code)的形式出现在以Unicode字符编码的文件的开始的头部,作为该文件的编码标识。 来举个很简单的例子,在windows下新建一个文本文件,并另…

utf8与utf16转换

1.UTF8与UTF16编码转换 std::string ConvertFromUtf16ToUtf8(const std::wstring& wstr) {std::string convertedString;int requiredSize WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, 0, 0, 0, 0);if(requiredSize > 0){std::vector<char> buffer(requ…

探究乱码问题的本源:GBK,UTF8,UTF16,UTF8BOM,ASN1之间的关联

文章目录 前言一、字符集和字符编码的区别和联系二、字符集编码的发展1.单字节2.双字节3.多字节(UNICODE字符集)&#xff08;1&#xff09;UTF-8&#xff08;2&#xff09;UTF-16&#xff08;3&#xff09;UTF-32&#xff08;4&#xff09;UTF BOM 三、不同编码方式的对比分析四…

oracle字符集utf16,oracle字符集AL16UTF16改为ZHS16GBK

AL16UTF16一个汉字占3个字节 ZHS16GBK一个汉字占2个字节 sql> conn / as sysdba; sql> shutdown immediate; database closed. database dismounted. oracle instance shut down. sql> startup mount; oracle instance started. total system global area 135337420 …

字符编码的概念(UTF-8、UTF-16、UTF-32都是什么鬼)

字符集为每个字符分配了一个唯一的编号&#xff0c;通过这个编号就能找到对应的字符。在编程过程中我们经常会使用字符&#xff0c;而使用字符的前提就是把字符放入内存中&#xff0c;毫无疑问&#xff0c;放入内存中的仅仅是字符的编号&#xff0c;而不是真正的字符实体。 这就…

UTF-8 与 UTF-16编码详解

目录 一、UTF-8编码 1、UTF-8介绍 2、UTF-8是如何编码的&#xff1f; 3、上述Unicode码点值范围中十进制值127、2047、65535、2097151这几个临界值是怎么来的呢&#xff1f; 二、UTF-16编码 1、UTF-16介绍 2、UTF-16编码方式 1&#xff09;设计思路 2&#xff09;具体…

了解一下UTF-16

1)先啰嗦一下 UTF-16是一种编码格式。啥是编码格式&#xff1f;就是怎么存储&#xff0c;也就是存储的方式。 存储啥&#xff1f;存二进制数字。为啥要存二进制数字&#xff1f; 因为Unicode字符集里面把二进制数字和字符一一对应了&#xff0c;存二进制数字就相当于存了二进制…

字符编码--UTF-16

2019独角兽企业重金招聘Python工程师标准>>> 第4节 UTF-16 UTF-16是Unicode字符编码五层次模型的第三层&#xff1a;字符编码表&#xff08;Character Encoding Form&#xff0c;也称为"storage format"&#xff09;的一种实现方式。即把Unicode字符集的抽…

蔡勒公式、三角函数

1.蔡勒公式 2.三角函数

蔡勒(Zeller)公式及其推导:快速将任意日期转换为星期数

0. 本文的初衷及蔡勒公式的用处 前一段时间&#xff0c;我在准备北邮计算机考研复试的时候&#xff0c;做了几道与日期计算相关的题目&#xff0c;在这个过程中我接触到了蔡勒公式。先简单的介绍一下蔡勒公式是干什么用的。 我们有时候会遇到这样的问题&#xff1a;看到一个日期…

1185.一周中的几天 四种解法(java),主要新学一下蔡勒公式

题目 给你一个日期&#xff0c;请你设计一个算法来判断它是对应一周中的哪一天。 输入为三个整数&#xff1a;day、month 和 year&#xff0c;分别表示日、月、年。 您返回的结果必须是这几个值中的一个 {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”…

给定日期(年月日)求星期几(蔡勒公式?没那么简单!)

前言 前几日做到一个机试题&#xff0c;给出一个日期&#xff0c;让你输出那天是星期几&#xff0c;这种题无疑两种思路&#xff1a;一是从今天&#xff08;前提是知道今天日期及周几&#xff09;开始推算&#xff0c;计算今天与目标日期差的天数再取模运算&#xff0c;考虑到…