格雷码编码+解码+实现(Python)

点击上方“计算机视觉工坊”,选择“星标”

干货第一时间送达

01 二值码
02 格雷码编码
2.1 编码优点
2.2 编码生成
2.3 递归生成
2.4 二值码转换
2.5 编码图
03 格雷码投影
3.1 投影图案生成
3.2 DLP投影图像
04 格雷码解码
4.1 全局/局部灰度阈值法
4.2 多幅图像阈值法
4.3 特殊情况
05 参考文献

01 二值码

先来说结构光中最简单的情况,时域上的编码,由于极线约束的关系,我们只需要在单方向上进行编码即可,我们以最简单的两灰度级三位二进制码为例,这里有个区域,其中亮区域对应编码1,暗区域对应编码0,假设现在我们向被测物顺序投射三幅二进制编码图案,如下所示:

图1 二进制码的编码与解码原理

现在,对于这些区域,对应的编码如下:

这些区域都被我们编码起来了,没毛病!但是这样的编码虽然很简单,但是存在问题!如果和格雷码一比,你一定一眼就可以发现。

02 格雷码编码

2.1 编码优点

二进制编码缺点:相邻区域的编码的位数变化太多了!

那这会带来什么问题?当然,在相机拍照清晰的情况下,这种编码方式当然不会出现任何问题。但问题就出现在,相机拍摄到的黑白相间的边界点往往是一个过渡灰度,很容易导致解码错误(0->1 or 1->0),这是自然二进制编码解码最容易出错的点。而格雷码最大的特定是相邻数字编码只相差一位,它们的对比如下所示:

这有什么优点呢?格雷码出错的概率更小,因为相邻区域的编码只有一位差异,有两种情况,假设编码只有一位差异,这一位错误编码出现在:

  • 非差异位:对这类编码错误,我们完全可以进行补救,因为相邻两个像素的编码应该是大部分相同的,我们可以对相邻两个像素的编码进行纠正,而二进制码可没有这个编码纠正机制;

  • 差异位:那无非是差一个像素而已,这时候我们无法区分这两块区域;

举个例子,对001(1)区域,它最容易出现错误的区域是黑白相间的边界处,错误的编码:011:

  • 二值码:3区域,差2个像素;

  • 格雷码:2区域,差1个像素,

另外,在编码的最后一幅图像里,条纹都是非常细的,以上面3位编码为例,查看编码最后位,如果是:

  • 二值码:01010101

  • 格雷码:01100110

由于漫反射的原因,通常容易出错的地方是黑白交错的区域解码,当条纹在最后一幅很细的时候,明显格雷码编码条纹更粗,可能出错的地方更少。

不论你是否理解,格雷码的主要优点就在于可以减小解码过程中的错误率,当然它依然有二值码一样的缺点,主要在于在选取位数较多的时候,最后几幅图的格雷码条纹会非常细,不容易分辨,因而我们通常只选取4位格雷码进行编码。这样的处理精度并不高,这也是后面我们结合相移法来进行编码、解码的主要原因。

补充:格雷码的其他应用

格雷码在传统二进制控制系统中也有广泛应用,例如数字3的表示法为011,要切换为邻近的数字4,也就是 100时,装置中的三个位元都得要转换,因此于未完全转换的过程时装置会经历短暂的,010、001、101、110、111等其中数种状态,也就是代表着2、1、5、6、7,因此此种数字编码方法于邻近数字转换时有比较大的误差可能范围。但这样的转换,对于一些追求硬件性能极限的嵌入式应用,比如说飞机的电传系统中,这样的翻转来不及转换很正常!这就很尴尬!相反,格雷码只需要一位翻转即可!

2.2 编码生成

  1. 改变最右边的为值;

  2. 改变右边第一个为1的位元,其左边位元值;

    <
  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值