一種基于四叉樹的二值圖像編碼與高效邏輯運(yùn)算方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及圖像處理、圖像壓縮、工業(yè)檢測、農(nóng)業(yè)生產(chǎn)與管理、交通、公共安全等應(yīng) 用領(lǐng)域,具體是一種基于四叉樹的二值圖像編碼與高效邏輯運(yùn)算方法。
【背景技術(shù)】
[0002] 在圖像壓縮和處理以及基于機(jī)器視覺的檢測中的對象識別和圖像理解任務(wù)中,會 頻繁地用到二值圖像的邏輯運(yùn)算。二值圖像的邏輯運(yùn)算??赏ㄟ^逐像素邏輯操作來高效、 便捷地完成,且空間開銷也可以接受。但是當(dāng)大量大尺寸的二值圖像進(jìn)行多次邏輯運(yùn)算時(shí), 這種逐像素運(yùn)算的方法,在時(shí)間和空間性能上都存在問題。例如在利用二值圖像區(qū)域的骨 架來描述和分析對象時(shí),常常需要采用骨架去毛刺的方法得到準(zhǔn)確的對象拓?fù)涮卣鳌,F(xiàn)在 的骨架去毛刺方法大多采用區(qū)域重構(gòu)的方式,通過反復(fù)計(jì)算若干骨架分支被去除之后,衡 量剩余的骨架所重構(gòu)的近似區(qū)域與原始區(qū)域相比的"相似度"來判斷這些骨架分支是否是 對于描述區(qū)域而言并不重要的毛刺骨架。這一反復(fù)進(jìn)行的區(qū)域重構(gòu)過程便涉及了為數(shù)眾多 的二值圖像的邏輯運(yùn)算。如果單純地采用逐像素操作,去毛刺過程將變得十分耗時(shí),空間開 銷也十分龐大。
[0003] 因此,有必要找到一種針對大量大尺寸的二值圖像的壓縮編碼表示方法,實(shí)現(xiàn)這 些二值圖像的壓縮表示,并且在這個壓縮表示的基礎(chǔ)上給出等價(jià)于二值圖像邏輯運(yùn)算的操 作,能夠以更快的速度來完成這些二值圖像的多次邏輯運(yùn)算。
【發(fā)明內(nèi)容】
[0004] 本發(fā)明所要解決的技術(shù)問題是針對大量大尺寸二值圖像,提供一種壓縮的表示方 法,并且基于這一表示方法給出等價(jià)于二值圖像邏輯運(yùn)算的操作,從而使得大量大尺寸二 值圖像間的多次邏輯運(yùn)算能夠快速且節(jié)約空間地完成。
[0005] 為解決上述技術(shù)問題,本發(fā)明提出的解決方案為:利用四叉樹來集約地表示參與 運(yùn)算的二值圖像,并通過將四叉樹結(jié)構(gòu)轉(zhuǎn)換為等價(jià)的編碼序列,來實(shí)現(xiàn)二值圖像的壓縮表 示,進(jìn)而通過編碼序列之間的運(yùn)算來等價(jià)地完成所需的二值圖像邏輯運(yùn)算,從而實(shí)現(xiàn)速度 快、空間開銷小的二值圖像邏輯操作。具體包括以下步驟:
[0006] i .將二值圖像I Q擴(kuò)充為邊長等于2 N的正方形圖像I,其中
Η和W分別為1〇的高和寬,[」表示向下取整操 作;擴(kuò)充方法是在10的下方增加2ν_Η行,增加的行中的像素值全部為邏輯0,即黑色點(diǎn);然后 再在進(jìn)行了上述行擴(kuò)充之后的圖像的右方增加2N_W列,增加的列中的像素值也全部為邏輯 0;
[0007] ii.將I轉(zhuǎn)換為基于四叉樹的編碼序列Q;
[0008] iii.將需要進(jìn)行的二值圖像邏輯操作轉(zhuǎn)換為一系列二值圖像的基本邏輯運(yùn)算,即 具有兩個操作數(shù)的基本二元邏輯運(yùn)算,包括邏輯與運(yùn)算AND、邏輯或運(yùn)算0R、邏輯異或運(yùn)算 X0R和邏輯差運(yùn)算SUB,以及具有單個操作數(shù)的基本一元邏輯運(yùn)算,即邏輯反運(yùn)算NOT;對于 二值圖像I,其邏輯非運(yùn)算NOT的結(jié)果是一幅與I相同大小的二值圖像IR,即Ir = NOT I,其中
[0009] IrQ,j)= !I(i,j),!表示單個邏輯變量的邏輯非運(yùn)算;
[0010] 對于二值圖像Ια和Ib,其二元邏輯運(yùn)算的結(jié)果是一幅相同大小的二值圖像IR,其中 每個像素點(diǎn)處的值由Ια和Ib相應(yīng)位置上的像素點(diǎn)值的邏輯運(yùn)算所決定;對邏輯與運(yùn)算AND, 有Ir=IaAND IB,其中
[0011] Ir(i,j) = Ia(i,j )&Ib( i,j),&表示單個邏輯變量的邏輯與運(yùn)算;
[0012] 對邏輯或運(yùn)算〇R,有IR=IA〇R IB,其中
[0013] IrQ,j) = lA(i, j) | lB(i, j),|表示單個邏輯變量的邏輯或運(yùn)算;
[0014] 對邏輯異或運(yùn)算X0R,有IR=IA XOR IB,其中
[0015] IR(i,j) = [IA(i,j)&IB(i,j)]|[!IA(i,j)&!I B(i,j)];
[0016] 對邏輯差運(yùn)算SUB,有Ir=IaSUB IB,其中
[0017] IR( i,j) = Ia( i,j )&! Ib( i,j);
[0018] 各式中i、j的取值范圍為0<i,j〈2N;
[0019] iv.在參與所需邏輯運(yùn)算的各幅二值圖像的基于四叉樹的編碼序列上,完成各個 基本邏輯運(yùn)算,即邏輯非運(yùn)算、邏輯與運(yùn)算、邏輯或運(yùn)算、邏輯異或運(yùn)算與邏輯差運(yùn)算,得到 結(jié)果編碼序列Qr;
[0020] V.根據(jù)Qr解碼得到2~乂2~大小的擴(kuò)充后的結(jié)果二值圖像,然后截取擴(kuò)充后的結(jié)果 二值圖像上部的Η行和左側(cè)的W列構(gòu)成的子圖像,即為最終的結(jié)果二值圖像。
[0021] 所述第ii步中的二值圖像編碼方法(方法Α),其具體步驟如下:
[0022] (A. 1)構(gòu)造經(jīng)過了擴(kuò)充的二值圖像I的四叉樹T(四叉樹的構(gòu)造可參考"C. R. Dyer, A .Rosenfeld,H.Samet. Region representation : Boundary codes from quadtrees.Communications of the ACM,1980,23(3):171-179");
[0023] (A. 2)從T的根節(jié)點(diǎn)開始,按深度優(yōu)先的方式遍歷T;
[0024] (A. 3)對遍歷過程中訪問的每個T的節(jié)點(diǎn)進(jìn)行編碼,每個節(jié)點(diǎn)的編碼包含如下信 息:表示該節(jié)點(diǎn)對應(yīng)的圖像區(qū)域是否為單一顏色區(qū)域的標(biāo)記u,表示該節(jié)點(diǎn)對應(yīng)的圖像區(qū)域 的顏色的標(biāo)記c,以及該節(jié)點(diǎn)在T中所處的層數(shù)level;針對上述節(jié)點(diǎn)信息,一種推薦的編碼 方式如下:對每個節(jié)點(diǎn)使用1個字節(jié)進(jìn)行編碼,該字節(jié)的最高位表示u,當(dāng)該節(jié)點(diǎn)對應(yīng)的圖像 區(qū)域只包含一種顏色時(shí),u = TRUE,否則u = FALSE;該字節(jié)的次高位表示c,當(dāng)u = TRUE且該節(jié) 點(diǎn)對應(yīng)的圖像區(qū)域的顏色為白色時(shí),c = T RU E,否則當(dāng)u = T R UE且該節(jié)點(diǎn)對應(yīng)的圖像區(qū)域的 顏色為黑色時(shí),c = FALSE,否則當(dāng)u = FALSE時(shí),c的取值不起作用;該字節(jié)的低6位以整型值 方式給出該節(jié)點(diǎn)的1 eve 1,根節(jié)點(diǎn)的1 eve 1 = 0,子節(jié)點(diǎn)的1 eve 1 =其父節(jié)點(diǎn)的1 eve 1+1;
[0025] (A.4)在T的遍歷完成后,按T中各節(jié)點(diǎn)在遍歷過程中被訪問的先后次序,將它們對 應(yīng)的編碼排列為一個字節(jié)串,便得到了二值圖像的編碼序列Q。
[0026] 所述第iv步中的二值圖像的邏輯非運(yùn)算的計(jì)算方法(方法B),其具體步驟如下: [0027] (B.1)令Q為進(jìn)行邏輯非運(yùn)算NOT I的二值圖像I對應(yīng)的編碼序列;初始化一個空的 編碼序列Qr;
[0028] (B. 2)從Q的第一個節(jié)點(diǎn)編碼開始依次遍歷Q;
[0029] (B. 3)令q為Q中的當(dāng)前節(jié)點(diǎn)編碼,qR為當(dāng)前節(jié)點(diǎn)的運(yùn)算結(jié)果編碼;如果q.u = FALSE,則置qR = q;否貝丨彳,置qR.u = TRUE,qR.c = !q.c,qR· level = q. level;將q加在Qr在尾部;
[0030] (B.4)當(dāng)Q遍歷完成后,Qr即為邏輯非運(yùn)算結(jié)果的編碼序列。
[0031]所述第iv步中的二值圖像的邏輯與運(yùn)算的計(jì)算方法(方法C),其具體步驟如下: [0032] (C. 1)令Qa和Qb分別為進(jìn)行邏輯與運(yùn)算IaAND IB的二值圖像Ια和IB對應(yīng)的編碼序 列;初始化一個空的編碼序列Qr;
[0033] (C.2)置qA為Qa中的第一個節(jié)點(diǎn)編碼,qB為Qb中的第一個節(jié)點(diǎn)編碼;
[0034] (C.3)若qA.u = FALSE且qB.u = FALSE,則將qA加在Qr的尾部,置qA為Qa中的下一個節(jié) 點(diǎn)編碼,置qB為Qb中的下一個節(jié)點(diǎn)編碼;
[0035] (C.4)否貝IJ,若qA.u = TRUE且qA.c = TRUE,則將qB以及Qb中緊跟在qB之后且level〉 qB.level的節(jié)點(diǎn)編碼依次加在Qr的尾部,置qA為Qa中的下一個節(jié)點(diǎn)編碼,置qB為Qb中下一個 滿足level < qB. level的節(jié)點(diǎn)編碼;
[0036] (C · 5)否則,若qA · u = TRUE且qA · c = FALSE,則將qA加在Qr的尾部,置qA為Qa中的下一 個節(jié)點(diǎn)編碼,置qB為Qb中下一個滿足level < qB. level的節(jié)點(diǎn)編碼;
[0037] (C.6)否則,若qB.c = TRUE,則將qA以及Qa中緊跟在qA之后且leVel>q A.level的節(jié)點(diǎn) 編碼依次加在Qr的尾部,置qB為Qb中的下一個節(jié)點(diǎn)編碼,置qA為Qa中下一個滿足level < qA. level的節(jié)點(diǎn)編碼;
[0038] (C. 7)否則,將qB加在Qr的尾部,置qB為Qb中的下一