接触式图像传感器的信号读取与补偿技术
图像传感器是利用光电转换原理将图像数据转换为一系列电子信号的一种装置。接触式图像传感器CIS是80年代末出现的一种新型图像传感器,是以CMOS技术为主的一种光电扫描器件。CIS相比于CCD具有体积小、速度快、成本低、安装调试简单等优点。但无论是CIS还是CCD都要考虑干扰信号、传感器偏差等因素对图像信号的影响,只有排除了这些影响,才能真实地再现图像信息。
明输出与暗输出
明输出VP是指当CIS读取白样张时,光电传感器输出的电信号值。
明偏差UP是指像素阵列中,所有像素点的明输出的偏差值。
UP=(Vpmax-Vpmin)/Vp
暗输出Vd是指当CIS读取黑样张时,光电传感器输出的电信号值。
暗偏差Ud是指像素阵列中,所有像素点的暗输出的偏差值。
Ud=Vdmax-Vdmin
图像的取样与量化
1、图像的取样
所谓取样就是用一个有限的数列、数阵来表示一幅连续图像。取样要遵循取样定理:对于一个函数fc(x,y),若其傅里叶变换FC(u,v)在空间领域的一个有限区域外(即|u|>uc或|v|>vc)处处为零,则当取样间隔△x≤1/2uc和△y≤1/2vc时,fc(x,y)可由它的样本值正确地重现,否则图像将产生畸变(即混叠效应)。把取样的最大间隔△x=1/2uc和△y=1/2vc称为奈奎斯特间隔,1/△x和1/△y称为奈奎斯特频率。
2、图像的量化
图像取样后,正比于图像灰度值的光电传感器输出的电子信号是模拟量,所以,必须把它变成数字信号,才能输入计算机进行数据处理。这种把图像信息实际输出的模拟量变换成离散的数字量的转换过程叫做量化。
采用均匀量化技术就是将Vp与Vd的差值Vp-Vd等间隔地取K个等级,通常量化等级K=2m,如果选用8位A/D转换器,则m=8,K=256级。
实际输出介于Ri与Vi之间的,取量化值Vi,介于Ri与Vi+1之间的取Vi+1。
下面通过均方误差技术,计算当量化误差最小时的量化判决电平值。
假设:f代表图像信息实际输出值,Φ(f)代表图像信息实际输出值在Vp与Vd之间的密度函数。则,对于K个量化级而言,量化均方误差为:
若Φ(f)=p=常数,即图像信息实际输出值在Vp与Vd之间出现的概率处处相等,于是得到:
输出电平的最佳取法应满足量化均方误差最小,即
dε/dRi=0
由上面两式可以得出:
Ri=(Vi+Vi+1)/2
即当Ri=(Vi+Vi+1)/2时,可以保证量化误差最小。
补偿技术
所谓补偿就是对CIS上的一列光电传感器之间输出值的偏差进行修正,使之能正确地反映图像信息。理论上说,这一列光电传感器对CIS输出的信号取样、量化后,要对它的明输出、暗输出进行补偿。
图1是表示CIS的实际输出值的状态图(补偿前),首先把所有点中,最大的明输出值定义为Vpmax,最小的暗输出值定义为Vdmin。从图1中可以看出,每一点的明输出Vpi、暗输出Vdi与Vpmax、Vdmin之间都有一个偏差值ΔVp、ΔVd,所谓补偿就是要消除每一点的偏差值对画质的影响。
补偿前,首先逐点测量CIS的明输出Vpi与暗输出Vdi,存入存储器。然后计算各点的补偿系数αi,并存入存储器,图2大体表达了明输出与补偿系数的分布,黑影部分就是当以为Vpmax目标时,每点需要补偿的值。
αi =(Vpmax—Vdmin)/(Vpi—Vdi)
接下来介绍补偿系数αi的应用方法。
扫描图像时,首先用A/D转换器对图像信息进行采样、量化,并取得各点的实际输出值Vi,然后利用下面的公式求得补偿后的数值Wi。
Wi=αi&TImes;(Vi—Vdi)
图3中,白影部分表示的是实际输出值Vi,黑影部分表示的是补偿后的输出值Wi,它们的关系就如同上面介绍的补偿公式的关系。通过Wi就可以得到真实的图像信息。
用软件实现
用C语言来实现计算过程。
设明输出Vpi的文件名为MOUT
设暗输出Vdi的文件名为AOUT
设采样值Vi的文件名为CAI
计算后αi的输出文件名为ALFA
计算后Wi的输出文件名为WIV
#include <stdio.h>
main()
{ FILE *mfp, *afp, *cfp, *mbfp, *abfp,*af, *wi;
FLOAT A,B,C,D,W,MAX,MIN;
mfp=fopen(“MOUT”,“rb”);
mbfp=mfp;
afp=fopen(“AOUT”,“rb”);
abfp=afp;
cfp=fopen(“CAI”,“rb”);
MAX=0.0;
MIN=0.0;
While(!feof(mfp))
{ scanf(mfp,“%f”,&A);
scanf(afp,“%f”,&B);
if (A>MAX) then MAX=A;
if (B<MIN) then MIN=B;};
mfp=mbfp;
afp=abfp;
af=fopen(“ALFA”,“wb”);
wi=fopen(“WIV”,“wb”);
while(!feof(mfp))
{ scanf(mfp,“%f”,&A);
scanf(afp,“%f”,&B);
scanf(cfp,“%f”,&C);
D=(MAX-MIN)/(A-B);
W=D*(C-B);
fprintf(af,“%f”,D);
fprintf(wi,“%f”,W);
}
fclose(mfp);fclose(afp);fclose(cfp);fclose(af);fclose(wi);
}