圖像傳感器是利用光電轉(zhuǎn)換原理將圖像數(shù)據(jù)轉(zhuǎn)換為一系列電子信號的一種裝置。接觸式圖像傳感器CIS是80年代末出現(xiàn)的一種新型圖像傳感器,是以CMOS技術(shù)為主的一種光電掃描器件。CIS相比于CCD具有體積小、速度快、成本低、安裝調(diào)試簡單等優(yōu)點。但無論是CIS還是CCD都要考慮干擾信號、傳感器偏差等因素對圖像信號的影響,只有排除了這些影響,才能真實地再現(xiàn)圖像信息。 明輸出與暗輸出 明輸出VP是指當CIS讀取白樣張時,光電傳感器輸出的電信號值。 明偏差UP是指像素陣列中,所有像素點的明輸出的偏差值。 UP=(Vpmax-Vpmin)/Vp 暗輸出Vd是指當CIS讀取黑樣張時,光電傳感器輸出的電信號值。 暗偏差Ud是指像素陣列中,所有像素點的暗輸出的偏差值。 Ud=Vdmax-Vdmin 圖像的取樣與量化 1、圖像的取樣 所謂取樣就是用一個有限的數(shù)列、數(shù)陣來表示一幅連續(xù)圖像。取樣要遵循取樣定理:對于一個函數(shù)fc(x,y),若其傅里葉變換FC(u,v)在空間領(lǐng)域的一個有限區(qū)域外(即|u|>uc或|v|>vc)處處為零,則當取樣間隔△x≤1/2uc和△y≤1/2vc時,fc(x,y)可由它的樣本值正確地重現(xiàn),否則圖像將產(chǎn)生畸變(即混疊效應(yīng))。把取樣的最大間隔△x=1/2uc和△y=1/2vc稱為奈奎斯特間隔,1/△x和1/△y稱為奈奎斯特頻率。 2、圖像的量化 圖像取樣后,正比于圖像灰度值的光電傳感器輸出的電子信號是模擬量,所以,必須把它變成數(shù)字信號,才能輸入計算機進行數(shù)據(jù)處理。這種把圖像信息實際輸出的模擬量變換成離散的數(shù)字量的轉(zhuǎn)換過程叫做量化。 采用均勻量化技術(shù)就是將Vp與Vd的差值Vp-Vd等間隔地取K個等級,通常量化等級K=2m,如果選用8位A/D轉(zhuǎn)換器,則m=8,K=256級。 實際輸出介于Ri與Vi之間的,取量化值Vi,介于Ri與Vi+1之間的取Vi+1。 下面通過均方誤差技術(shù),計算當量化誤差最小時的量化判決電平值。 假設(shè):f代表圖像信息實際輸出值,Φ(f)代表圖像信息實際輸出值在Vp與Vd之間的密度函數(shù)。則,對于K個量化級而言,量化均方誤差為: 若Φ(f)=p=常數(shù),即圖像信息實際輸出值在Vp與Vd之間出現(xiàn)的概率處處相等,于是得到: 輸出電平的最佳取法應(yīng)滿足量化均方誤差最小,即 dε/dRi=0 由上面兩式可以得出: Ri=(Vi+Vi+1)/2 即當Ri=(Vi+Vi+1)/2時,可以保證量化誤差最小。 補償技術(shù) 所謂補償就是對CIS上的一列光電傳感器之間輸出值的偏差進行修正,使之能正確地反映圖像信息。理論上說,這一列光電傳感器對CIS輸出的信號取樣、量化后,要對它的明輸出、暗輸出進行補償。 圖1是表示CIS的實際輸出值的狀態(tài)圖(補償前),首先把所有點中,最大的明輸出值定義為Vpmax,最小的暗輸出值定義為Vdmin。從圖1中可以看出,每一點的明輸出Vpi、暗輸出Vdi與Vpmax、Vdmin之間都有一個偏差值ΔVp、ΔVd,所謂補償就是要消除每一點的偏差值對畫質(zhì)的影響。 補償前,首先逐點測量CIS的明輸出Vpi與暗輸出Vdi,存入存儲器。然后計算各點的補償系數(shù)αi,并存入存儲器,圖2大體表達了明輸出與補償系數(shù)的分布,黑影部分就是當以為Vpmax目標時,每點需要補償?shù)闹怠?br /> αi =(Vpmax—Vdmin)/(Vpi—Vdi) 接下來介紹補償系數(shù)αi的應(yīng)用方法。 掃描圖像時,首先用A/D轉(zhuǎn)換器對圖像信息進行采樣、量化,并取得各點的實際輸出值Vi,然后利用下面的公式求得補償后的數(shù)值Wi。 Wi=αi×(Vi—Vdi) 圖3中,白影部分表示的是實際輸出值Vi,黑影部分表示的是補償后的輸出值Wi,它們的關(guān)系就如同上面介紹的補償公式的關(guān)系。通過Wi就可以得到真實的圖像信息。 用軟件實現(xiàn) 用C語言來實現(xiàn)計算過程。 設(shè)明輸出Vpi的文件名為MOUT 設(shè)暗輸出Vdi的文件名為AOUT 設(shè)采樣值Vi的文件名為CAI 計算后αi的輸出文件名為ALFA 計算后Wi的輸出文件名為WIV #include 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 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); } |