0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

結(jié)構(gòu)光|格雷碼解碼方法

新機(jī)器視覺 ? 來源:3D視覺工坊 ? 作者:3D視覺工坊 ? 2022-12-21 11:14 ? 次閱讀

格雷碼是一種特殊的二進(jìn)制碼,在結(jié)構(gòu)光三維視覺中,常常被用于編碼。比起我們常見的二進(jìn)制碼,格雷碼具有相鄰數(shù)字的編碼只有一位不同的優(yōu)點(diǎn),這個(gè)優(yōu)點(diǎn)對于解碼而言十分重要,可以減少光解碼的錯(cuò)誤率。下面我們可以看下如何對結(jié)構(gòu)光用格雷碼編碼,并如何對編碼的結(jié)構(gòu)光進(jìn)行解碼。

以5位格雷碼為例,5位格雷碼可以對32個(gè)像素位置進(jìn)行編碼,由之前的文章可以知道,我們在計(jì)算結(jié)構(gòu)光三維重建時(shí),只需要對結(jié)構(gòu)光圖片的一個(gè)方向編碼,以常見的列格雷碼為例,如圖所示是5位列格雷碼編碼圖片集。

490d0dac-8044-11ed-8abf-dac502259ad0.png

圖中我們對每個(gè)像素點(diǎn)進(jìn)行了格雷碼編碼,每一張圖片都代表了格雷碼的某一位,以圖片第1列為例,其格雷碼編碼為00001,則前4張圖片中第一列的的格雷碼編碼的條紋都是黑色,代表0,而最后一張圖片第一列的格雷碼編碼是白色,代表1.

格雷碼的解碼很簡單,只要把投影的格雷碼結(jié)構(gòu)光再還原回十進(jìn)制數(shù)字,我們就能知道相機(jī)中的像素點(diǎn)(uc,vc)對應(yīng)的是投影圖片的哪一列(up)了。想要得到一個(gè)好的三維重建結(jié)果,主要是對相機(jī)捕捉到的結(jié)構(gòu)光進(jìn)行準(zhǔn)確的二值化操作,使得相機(jī)圖片中每個(gè)像素點(diǎn)都能夠正確解碼。

常見的二值化操作有很多,最簡單的是設(shè)一個(gè)全局灰度閾值,對灰度值高于閾值的像素點(diǎn)置1,對灰度值低于閾值的像素點(diǎn)置0。或者利用局部自適應(yīng)閾值對圖片進(jìn)行二值化操作等·。常見的利用每個(gè)像素點(diǎn)周邊灰度信息的二值化操作,往往不能夠滿足格雷碼結(jié)構(gòu)光解碼的二值化需求。因?yàn)槭褂媒Y(jié)構(gòu)光的環(huán)境往往是未知且復(fù)雜的。比如同樣的結(jié)構(gòu)光光強(qiáng)照在黑色物體表面的亮度比照射在白色物體表面的亮度要低。這意味著同樣的光條紋在不同物體上獲取的灰度值不同。由于不能提前預(yù)知環(huán)境中的物體表面信息,僅僅靠簡單的利用像素點(diǎn)及其周周圍灰度值的分布得出該像素點(diǎn)當(dāng)前是來自結(jié)構(gòu)光的亮條紋還是暗條紋是及其不準(zhǔn)確的。

雖然由于環(huán)境光,以及物體表面材質(zhì)的原因,一幅圖像中像素的亮度(灰度值)通常是不均勻的,無法直接利用一張圖片呈現(xiàn)的灰度信息對結(jié)構(gòu)光解碼,但是我們可以利用結(jié)構(gòu)光系列圖片來幫助獲取像素點(diǎn)當(dāng)前是亮條紋還是暗條紋的信息。以上圖的格雷碼編碼為例,一個(gè)5位的格雷碼編碼需要投影5張結(jié)構(gòu)光圖片,假設(shè)有一個(gè)編碼為 11011的格雷碼條紋打在物體表面上,,在連續(xù)投影的5張格雷碼圖片中,物體表面被編碼照射的位置既經(jīng)歷過暗條紋(編碼為0)又經(jīng)歷過亮條紋(編碼為1)。不過由于每張格雷碼編碼圖片的光源編碼不同,而且結(jié)構(gòu)光光源在物體表面上形成的漫反射不同,當(dāng)結(jié)構(gòu)光編碼圖片不一樣時(shí),即使是同樣經(jīng)歷亮條紋照射,該位置的亮度(灰度值)也是不同的??偟膩碚f,對于同一個(gè)位置,可以近似認(rèn)為其被亮條紋照射到的亮度總是高于其被暗條紋照射到的亮度。那么對于一個(gè)像素點(diǎn)在一張圖片中的二值化可以用如下方法。

首先找到像素點(diǎn)在系列格雷碼圖片中最大的灰度值,記為Imax,并找到該像素點(diǎn)在系列格雷碼圖片中最小的灰度值,記為Imin。對于每張圖片,我們可以這樣計(jì)算,

In=(I-Imin)/(Imax-Imin)

其中I是該像素點(diǎn)在當(dāng)前圖片下的亮度,In可以看做是被歸一化(normalize)后的灰度值,顯然In的取值范圍是[0,1]的。由上述公式可以看出,如果該像素點(diǎn)當(dāng)前經(jīng)歷的是暗條紋,其值會(huì)接近最小的灰度值,In接近0,反之,In會(huì)接近1, 于是我們可以設(shè)計(jì)一個(gè)閾值,比如0.5,即當(dāng)In大于0.5時(shí),我們認(rèn)為其值是偏亮的,此時(shí)像素經(jīng)歷的是亮條紋編碼,反之,如果In小于0.5時(shí),該像素此時(shí)經(jīng)歷的是暗條紋編碼。值得注意的是,這個(gè)方法對于編碼全為0的點(diǎn),或者編碼全為1的點(diǎn),會(huì)有影響,因?yàn)榫幋a全0的點(diǎn)和編碼全1的點(diǎn)不會(huì)同時(shí)經(jīng)歷明暗變化。解決方法是避開這個(gè)編碼,或者額外投圖片讓所有編碼位置都能經(jīng)歷全0或者全1的過程。

上述方法的前提是近似認(rèn)為被亮條紋照射到的亮度總是高于該位置被暗條紋照射到的亮度。實(shí)際上這個(gè)假設(shè)成立的前提是物體間沒有漫反射,以及投影投射的光之間不會(huì)互相干擾。在一些特殊的位置,是有可能物體在經(jīng)歷亮條紋時(shí)其亮度值比其經(jīng)歷暗條紋時(shí)要暗。因?yàn)槊繌埜窭状a圖片總體的光分布是不一樣的,如上圖的第一張和最后一張,第一張光主要分布在右邊半邊,而最后一張條紋光很細(xì),是明暗相間的。不一樣的格雷碼圖片的光強(qiáng)分布,會(huì)造成物體間漫反射的光強(qiáng)不一樣,導(dǎo)致其經(jīng)歷暗條紋時(shí)周圍物體間漫反射到的光遠(yuǎn)大于結(jié)構(gòu)光光源發(fā)出來的光。實(shí)際上這是有可能的,比如該像素點(diǎn)處于某個(gè)物體對的陰影部分,一般情況下這樣的點(diǎn)是沒有光變化的,因?yàn)榻Y(jié)構(gòu)光本身無法直射到該位置,但是因?yàn)槠渲苓呂矬w漫反射的光有可能導(dǎo)致這個(gè)位置的光強(qiáng)發(fā)生劇烈變化。出現(xiàn)該位置經(jīng)歷暗條紋時(shí)光強(qiáng)比經(jīng)歷亮條紋時(shí)還要強(qiáng)。為了解決這類特殊的點(diǎn),論文[2] 給出其思路如下:

49283276-8044-11ed-8abf-dac502259ad0.png

如圖所示,我們可以對每幅格雷碼編碼的條紋做一個(gè)逆向圖,把原來編碼條紋中的1的位置變?yōu)?,0的位置成1。這樣我們把每一幅編碼圖片變成了一對編碼圖. 我們可以通過比較一對編碼圖中每個(gè)像素的灰度差值來判斷其值為0還是為1。這個(gè)很容易理解,因?yàn)槿绻幋a是亮條紋,則其逆向編碼是暗條紋,則圖片上編碼是亮條紋的時(shí)候?qū)?yīng)的點(diǎn)比編碼是暗條紋(逆向)的時(shí)候?qū)?yīng)的像素點(diǎn)更亮,即灰度值更高。反之亦然, 這樣就可以簡單地對相機(jī)圖片上的結(jié)構(gòu)光條紋解碼了。

這個(gè)思路很簡單,對大部分相機(jī)圖片上的點(diǎn),這樣的解碼效果就足夠好了。但是仍然不能解決上述提到的問題。對于部分點(diǎn),其經(jīng)歷暗條紋時(shí)仍舊可能比經(jīng)歷亮條紋時(shí)灰度值要更高。于是論文【2】在上述思路上,再增加了一部分想法,如果我們能求出當(dāng)前灰度值中可能的來自結(jié)構(gòu)光直接光源的成分的比例,就可以幫助我們辨別出該點(diǎn)是否經(jīng)歷暗條紋或者亮條紋。具體計(jì)算規(guī)則如下:

493f74e0-8044-11ed-8abf-dac502259ad0.png

其中p指像素坐標(biāo),Lp+ 是像素在格雷碼系列圖中灰度最大值,Lp-是像素在格雷碼系列圖中灰度最小值。Ld可以看作是該像素點(diǎn)來自直接光源的灰度值,Lg可以看作來自其他光源(物體間漫反射和環(huán)境光)等的光源的灰度值。對于大部分情況,顯然來自投影光的光強(qiáng)較強(qiáng),Ld>Lg。但是對于部分點(diǎn)Ld

對每個(gè)像素點(diǎn)p和其灰度值I,有如下二值化規(guī)則其中m是一個(gè)比較小的常數(shù)閾值,I_inv是條紋結(jié)構(gòu)光的逆向圖。

I

Ld>Lg 且滿足 I>I_inv 該點(diǎn)二值化為1

Ld>Lg 且滿足I

ILg 該點(diǎn)二值化為0

I>Lg 且滿足I_inv

不符合以上所有條件的點(diǎn)為不確定點(diǎn)

有了以上的二值化方法,格雷碼的編碼和解碼都不是什么太大的問題,解碼后可以根據(jù)筆者之前文章提供的三維數(shù)據(jù)計(jì)算方法得到較為準(zhǔn)確的物體三維信息。

在文章的最后,筆者想討論下為什么格雷碼編碼比一般的二進(jìn)制編碼要好。我們知道格雷碼最大的優(yōu)點(diǎn)是十進(jìn)制相鄰數(shù)字編碼只相差一位。那為什么這樣就比普通二進(jìn)制編碼好呢?我們知道,解碼最容易出錯(cuò)的點(diǎn),往往是黑白相間的邊界點(diǎn),相機(jī)拍攝到的黑白相間的邊界點(diǎn)往往是一個(gè)過渡灰度,很容易導(dǎo)致解碼錯(cuò)誤,所以相鄰的數(shù)字間位數(shù)差別越多,其黑白相間的變化越多,自然出錯(cuò)的概率也更大。對于這一點(diǎn),其實(shí)有一個(gè)圖片很直觀感受到,如果我們對每個(gè)像素進(jìn)行格雷碼編碼,那么無論多少位編碼,在其編碼的最后一張圖片上,條紋通常是非常細(xì)的,如果是普通二進(jìn)制編碼,其最后一張細(xì)條紋圖片是每個(gè)像素之間編碼都不一樣,對一幅圖片從左到右呈現(xiàn)010101…的變化,而如果用格雷碼編碼則會(huì)呈現(xiàn)0110011…的變化,明顯格雷碼編碼其投影條紋更粗,更不容易解碼出錯(cuò)。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 解碼
    +關(guān)注

    關(guān)注

    0

    文章

    181

    瀏覽量

    27393
  • 格雷碼
    +關(guān)注

    關(guān)注

    2

    文章

    34

    瀏覽量

    13191
  • 結(jié)構(gòu)光
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    13237
收藏 人收藏

    評論

    相關(guān)推薦

    什么是

    (Gray code),又叫循環(huán)二進(jìn)制或反射二進(jìn)制 在數(shù)字系統(tǒng)中只能識別0和1,各種數(shù)據(jù)要轉(zhuǎn)換為二進(jìn)制代碼才能進(jìn)行處理,
    發(fā)表于 11-11 09:34 ?7356次閱讀
    什么是<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>碼</b>

    簡介及格與二進(jìn)制的轉(zhuǎn)換程序

    科學(xué)的發(fā)展。/*與二進(jìn)制的轉(zhuǎn)換程序 * 本程序采用遞推的方法進(jìn)行推導(dǎo),可以轉(zhuǎn)換0~2147483647之間的數(shù)(1~31位) * 推導(dǎo)方式如下(以三位
    發(fā)表于 04-22 09:00

    什么是BCD、8421、余三

    的是8421BCD,無權(quán)用得較多的是余三,我們通常所說的BCD
    發(fā)表于 11-03 17:36

    介紹

    介紹
    發(fā)表于 08-14 09:44

    的規(guī)則和應(yīng)用問題?

    今天看到一個(gè)計(jì)數(shù)的程序,搜了下定義,覺得還是云里霧里,定義寫的是若任意兩個(gè)相鄰的代碼只有一位二進(jìn)制數(shù)不同,則這種編碼為
    發(fā)表于 08-20 14:41

    簡介及格與二進(jìn)制的轉(zhuǎn)換程序

    簡介及格與二進(jìn)制的轉(zhuǎn)換程序
    發(fā)表于 01-16 11:52 ?5032次閱讀

    運(yùn)算研究

    運(yùn)算研究 在數(shù)字系統(tǒng)中只能識別0和1,各種數(shù)據(jù)要轉(zhuǎn)換為二進(jìn)制代碼才能進(jìn)行處理,是一
    發(fā)表于 03-18 14:07 ?1461次閱讀

    循環(huán)VHDL源程序

    我們知道計(jì)數(shù)的特點(diǎn)就是相鄰的碼字只有一個(gè)比特不同,那么我們在設(shè)計(jì)計(jì)數(shù)時(shí)找到這個(gè)比特取
    發(fā)表于 11-11 09:32 ?2116次閱讀

    轉(zhuǎn)二進(jìn)制方法

    二進(jìn)位碼第n位 = 二進(jìn)位碼第(n+1)位+第n位。因?yàn)槎M(jìn)位碼和皆有相同位數(shù),所以
    發(fā)表于 11-11 09:38 ?7733次閱讀
    <b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>碼</b>轉(zhuǎn)二進(jìn)制<b class='flag-5'>方法</b>

    辨析

    討論了Gray Code 的由來,剖析了關(guān)于的一些不合理說法,明確了其正宗的發(fā)明者應(yīng)該是弗蘭克·,正確的英文名稱是Gray Cod
    發(fā)表于 11-28 16:04 ?5707次閱讀
    <b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>碼</b>辨析

    編碼規(guī)則_有什么規(guī)律

    典型的二進(jìn)制簡稱,因1953年公開的弗蘭克·
    的頭像 發(fā)表于 03-02 14:29 ?5.6w次閱讀
    <b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>碼</b>編碼規(guī)則_<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>碼</b>有什么規(guī)律

    如何把二進(jìn)制轉(zhuǎn)換為?是如何判斷讀空寫滿呢?

    在傳遞讀寫時(shí)鐘域的指針使用來傳遞,如何把二進(jìn)制轉(zhuǎn)換為,
    的頭像 發(fā)表于 09-15 09:38 ?8332次閱讀
    如何把二進(jìn)制轉(zhuǎn)換為<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>碼</b>?<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>碼</b>是如何判斷讀空寫滿呢?

    的編制規(guī)律

    (Gray Code)是由貝爾實(shí)驗(yàn)室的弗蘭克·(Frank Gray,1887-1969)在20世紀(jì)40年代提出,并在1953年取
    的頭像 發(fā)表于 07-03 11:41 ?5747次閱讀

    如何對結(jié)構(gòu)光用編碼 如何對編碼的結(jié)構(gòu)進(jìn)行解碼

    解碼很簡單,只要把投影的
    的頭像 發(fā)表于 12-21 11:06 ?1319次閱讀

    如何使用純進(jìn)行三維重建?

    對于新手來說,使用做單目結(jié)構(gòu)三維重建是一個(gè)入門級的訓(xùn)練。但是在復(fù)現(xiàn)時(shí)往往會(huì)遇到一個(gè)問題,明明解碼
    的頭像 發(fā)表于 01-13 11:41 ?1142次閱讀