影像處理演算法實現於平板顯示控制器F*Con-V.1之晶片製作Chip Implementation of Image Processing Algorithms for Flat Panel
Display Controller F*Con-V.1
宋志雲陳永璁陳志炘宋易勳
中華大學電機工程學系
Tze-Yun Sung Yung-Tsung Chen Chih-Sin Chen
Department of Electrical Engineering
Chung-Hwa University
Tel:886-3-579-0902 Fax: 886-3-578-1150
Email: w, w, w, w
摘要
本文旨在針對平板顯示器控制器(Flat panel controller)內部之規模縮放器(Scaler)亮度與對比度調整器(Brightness and Contrast Adjuster)、γ修正器(Gamma Correction)與影像顏色濃淡補正器(Dithering)等模組的演算法(Algorithm)深入探討並以硬體描述語言(Hardware Description Language)實現電路,以達即時工作的能力。
1. 規模縮放器(SCALER)
規模縮放器,主要是將輸入之畫面做放大或縮小之動作。但是如何將畫面做放大或縮小之動作且盡量達到不失真的狀態,就是文中要說明的部分。
在硬體結構上中我們並不使用Deinterlace的架構也不使用DSP。在處理小數點之過程中也僅以最簡單之乘法器及利用某些位元來達到4捨5入之運算,並在硬體架構上使用最少的記憶體以節省成本,本文中僅討論規模縮放器的運作方式。
圖1,是整個平板顯示器控制器的流程圖,所表示的僅是資料之流向,其順序亦與實際的系統架構圖相同。不同的只是少了暫存器、MCU介面與細部的關連圖。
圖2,是規模縮放器的架構圖。INP方塊之功用在於辨別輸入端之訊號,資料經由INP模組選擇判斷並轉換為YUV4:2:2模式(Video、S-Video、HDTV),若為RGB訊號則不轉換。之後INP模組便會將
把握节奏視訊訊號與相關控制訊號輸出給規模縮放器(SC模組)。CSC則為色彩空間轉換器(Color Space Convertor),其功能在於將經過規模縮放器運算後之視訊資料轉換為RGB之視訊規格(YUV 4:2:2轉為RGB規格,若原輸入即為RGB訊號則不做任何動作)。CSC的內部架構僅是將YUV 轉RGB的公式以硬體電路來實現(乘法器、加法器與位移之組合),故在此並不解釋其內部架構。
在架構圖中,共有Y-buffer、Y-calculator、
X-buffer 、X-calculator 、sc-fifo 、sc-fifo4、sc-coeff 、SC-main 等模組。其中sc_fifo 與sc_fifo4模組為提供Y-buffer 與X-buffer 使用之記憶體模組,其宣告與動作之方式不在此敘述。如架構圖中所示,進入之畫面訊號均先進入Y-buffer 中儲存,為節省成本並且不損及性能,只在Y-buffer 中使用了可以儲存8條掃瞄線的記憶體(1024 pixels * 3-bytes * 8 Lines )。
1.2資料的存取與運算
在創造出新的水平掃瞄線之期間,每一個輸出時脈均會取上下相鄰之4條水平掃瞄線上同一個水平位置的pixels 之資料來做運算,並以此造出新的pixels ,而這一些新的pixels 的集合就是1條新的水平掃瞄線。以上之運算過程就交由Y-calculator 來做運算,Y-buffer 僅負責取出4個上下相鄰之pixels 資料。取出pixels 資料的示意圖如圖3與圖4所示:
川端康成古都註1: L25 ’new 表示是已經擴(縮)完線之新水平掃瞄線(暫時性的),但尚未擴(縮)點,故並非最後輸出。
如圖3與圖4,在L25’new (暫時性的新水平掃瞄線)產生期間,在所設計的硬體電路中,資料
的讀取一直維持在Line 20 ~ Line 23相同水平位置的pixels 的資料,並將所得到的資料依序指定為p_m1(pixel minus 1)、p_z0(pixel zero )、p_p1(pixel plus 1)、p_p2(pixel plus 2),而新pixel 值所使用的部分程式,如程式片段1與程式片段2,與計算公式如下(註2):
註 2:單一pixel 的RGB 3原色分開計算,若原訊
號為YUV4:2:2格式,因YUV 格式轉換為RGB 格式為線性方程式,故可如RGB 方式處理。待規模縮放器處理完後再由CSC 做轉換格式之動作。
程式片段2中之myr 就是程式片段1中4項之總和,因p_m1 ~ p_p2原為色階值(0 ~ 255),在乘上0 ~ 255之係數後必須再除以256所得之值才為以權重計算之新pixels ,故ry 最後會去掉最後8個低位元(亦即除以256之意)。程式片段2中,加上myr_[16:8]之意思為補償計算後之新值,因為係數最大為255,但最後卻需除以256,故會產生誤差,故補償之。程式片段2中,加上8’ h80(=128),就是加上0.5之意,若原值小數部分大於0.5就會因此而進位。
故在硬體電路中,我們並不需要加入DSP 就
能達到與DSP 運算後差異極小之結果,因而達到降低成本之目的。 1.3擴(縮)線之方法
在Y-buffer 中,使用水平掃瞄線資料組停留或跳躍的方式來達到擴線或縮線之動作,其中,停留或跳躍的方式依據平均分散原則。例如原輸入為800條水平線掃瞄,若要擴展為1024條水平掃瞄
線,平均每3.57條水平掃瞄線就要停留1次水平掃瞄線位址,以多計算出1條新水平掃瞄線。由於水平掃瞄線的數目均為整數條,因此以另一種演算法,使得擴線的方式能夠精準的在當使用到最後一組(2條)水平掃瞄線資料時,能夠恰好創造出所需的水平掃瞄線條數。
最後3條新水平掃瞄線所使用之輸入水平掃瞄線資料組中之資料數依序為4條、3條、2條。如倒數第3條新水平掃瞄線使用原輸入之{Last 4、Last 3、Last 2、Last 1};倒數第2條新水平掃瞄線使用原輸入
之{Last 3、Last 2、Last 1、Last 1};倒數最後1條新水平線使用原輸入之{Last 2、Last 1、Last 1、Last 1},其目的在使最後3條新水掃瞄平線之比重漸漸偏向原輸入之最後1條水平線掃瞄訊號。其中Last n 表示最後之第n 條水平掃瞄線資料。
1.4擴線(水平掃瞄線資料組停留)
在800條水平線擴展為1024條水平線的例子中,我們使用特殊之演算法得到以下之結果: inc_p = 1、1、1、0、1、1、1、0、1、1、1、1、
0、1、1、1、0、1…
春简笔画
以上的數字表示下1條新水平掃瞄線所要使用的資料組(每4條水平線掃瞄資料為1組)往下位移多少條水平掃瞄線,1表示往下位移1條水平掃瞄線,0表示不位移,意即使用原來之資料(水平掃瞄線位址停留…擴線)。其示意圖為圖5。
圖5中,圈圈右上方之數字表示所產生之新水平掃瞄線之次序,如圖中第3個圈圈表示由原輸入水平線訊號 Line 22 ~ Line 25 產生 L27 ’new 。若以運算式表示,則可以表示如下:
L27 ’new = a*L22 + b*L23 + c*L24 + d* 25 其中,L28 ’ new 與L27 ’ new 使用相同之4條水平線資料作運算,但其使用之係數不同(因程式寫法所造成,避免只是重複同一條線),其運算式如下: L28 ’new = e*L22 + f*L23 + g*L24 + h*L25 由兩個式子中,可以發現所使用之係數不同,故所新增加之水平線掃瞄部分,並不會與上一條新增之水平掃瞄線相同。水平線掃瞄位址每停留1次,就會增加1條新的水平掃瞄線。在這種狀況下,當程式中使用到最後一組水平掃瞄線畫面資料時,會剛好停留相當於我們想要增加的水平掃瞄線數目的次數,並且是以平均分散的原則來做擴線之動作。在上圖中,使用了3組水平線掃瞄資料卻得到5條新水平掃瞄線,因此達到了擴線的目的,同時也兼顧了平均分散之原則。至於係數之部分後面會再加以討論。而擴線時所使用之係數方面則有些許之不同。如同程式片段
信手拈来的意思
3中,pha 之值在每1條水平掃瞄線終結後均會更新,不會有停留之現象。 inc_p 之值在每1條水平掃瞄線起始時更新。
1.5縮線
當水平線進行縮線時會得到以下inc_p 值: inc_p = 1、1、1、2、1、1、1、2、1、1…
如圖6中之L18 ’new 與L19 ’new 所使用的水平掃瞄線資料組相差2條水平掃瞄線,其原因在於當進行到L19 ’new 之計算時,其inc_p 之值為2,意即該新水平掃瞄線之資料組與上1條新水平掃
瞄線資料組相差2條水平掃瞄線。由上圖中可以看出當使用了5組水平掃瞄線資料組時(每上下相鄰4條水平線為1組),卻只產生了4條新水平掃瞄線,因此也達到了所要求的縮線之效果,同時兼顧平均分散之原則。如同擴線中所提一樣,縮線之狀況下,inc_p[1:0]之值大於1,因為使用之資料
圖5 擴線示意圖
組並非只是往下位移1條水平掃瞄線,而是2條水平掃瞄線以上。如同圖6中之L18 ’new 與L19 ’new ,並使所使用之原輸入水平掃瞄線資料提前被使用完畢,以達到縮線之目的。
1.6規模縮放器所使用之係數
SC-coeff 即Coefficient of Scaler 之意,在程式中因為會有水平線位址或pixels 位址(擴、縮點時使用)之停留或跳躍,為了使運算後之顏色分佈能夠平均分散(水平線或pixels 均同),並盡量與原輸入成比例之狀態,因而利用SC-coeff 中之係數值來對顏色重新進行調整,而其係數值相當於權重比。為了解釋此行文字,以單色之水平線來解釋(圖中以Green 之色階來表示),其圖如圖7。
依程式中之演算法(vratio = 5120),L37 ’new ~ L40 ’new 所使用之係數各為(0、255、0、0);(-18、221、58、-6);(-16、144、143、-16);(-6、58、221、-18),所得到之新水平線之值各為: L37 ’new :
( 0×200 + 255×180 + 0×160 + 0×140 )÷ 256 = 179
L38 ’new :
( -18×180 + 221×160 + 58×140 - 6×120 )÷ 256 = 154
L39 ’new :
( -16×160 + 144×140 + 143×120 -16×100 )÷ 256 = 130
L40 ’new :
( -6×160 + 58×140 + 221×120 -18×100 )÷ 256 = 125
L41 ’new :
( 0×140 + 255×120 + 0×100 - 0×80 )÷ 256 = 120
三资清理原 Line 31 ~ Line 34 之值為 180、160、140、120,經過擴線運算後其值為179、154、130、125、120,其中125為經過運算後之新水平線,因此我們可以達到擴線但在其色階值上是人眼可以接受的範圍。
係數表(擴大時使用,另有縮小時之係數表)如表表1,可以看到當pha 值越大時,其比重漸漸偏向第3項之係數(coeff[16:9])。而inc_p 與pha 均與vratio 值有關,如程式片段4與程式片段3。在程式片段4中ratio (Y-buffer 中ratio = vratio )會影響total_p 之值,而total_p 會影響pha 之值。
鹅肝酱
1.7
鸡肉怎么做好吃又简单擴(縮)點
在規模縮放器中,擴(縮)完線之後的新水平掃瞄線(尚未進行擴縮點)會將其運算後之
pixels 之新資料交由X-buffer 與
X-calculator 去做運算以進行擴(縮)點之動作。在X-calculator 上其運作方式與Y-calculator 相同,
2者均將由Y-buffer 或X-buffer 中所選出之
4個pixels 之資料依造權重重新計算出新值。所不同的是Y-buffer 所取之資料是上下相鄰之4條水平掃瞄線上相同水平位置的pixels ,如圖1;而X-buffer 所取之資料為同1條水平掃瞄線上左右相鄰之4個pixels 之資料,如圖8
如圖中所示L20’ new 只是過渡時其中的新水平掃瞄線,尚未經過擴(縮)點之動作。而New Line 20為L20’ new 經過擴(縮)點運算後(亦可不擴縮點)之最後輸出水平掃瞄線,往後只剩下諸如亮度、對比、色溫…等之修正,已經與縮放無關。 1.8 X-buffer 資料之取得
原則上X-buffer 與Y-buffer 在取得資料之概念上是相同的,但是因為程式上之些許差異,造成其排列之方式略有不同。今程式如下:
程式片段5中,addr_nl0 ~ addr_nl3會隨著addr_l0 ~ addr_l3之值與inc_p 一直做變換。而在程式片段14中,addr_nl0 ~ addr_nl3會Feedback (回授)給addr_l0 ~ addr_l3,如此一直循環將造成addr_nl0 ~ addr_nl3比addr_l0 ~ addr_l3要延遲1個Display Clock 時間。
程式片段6、7中,可知程式中利用addr_l0來做為選取資料來源之依據。因addr_l0之變化為循序性之
位移(相當於addr_type 亦同),故可達到每1個Display Clock 均可取出不同之pixels 資料組(相鄰之資料組)。
由於在程式中之些許不同,造成Y-buffer 與X-buffer 在資料的排列上有些微差異,茲將其新pixels 之運算之方式舉1例列出:
New Pixel 2 = a * P5 + b * P2 + c * P3 + d * P4 New Pixel 3 = e * P2 + f * P3 + g * P4 + h * P5
(假設擴點時,inc_p = 0)紫花苜蓿种子
New Pixel 3 = e * P7 + f * P4 + g * P5 + h * P6
(假設縮點時,inc_p = 2)
註Pn :輸入X-buffer 之Pixel n 之值
以圖表示,其資料排列差異如下(不考慮係數): Y-buffer :
New Pixel = a *○1+b *○2+c *○3+d *○4 X-buffer :
New Pixel = a *○4+b *○1+c *○2+d *○3 以上即為X-buffer 與Y-buffer 在資料取得後排列上之差異。